我试图访问shellwindows实例以查找IE时遇到异常,所以我可以附加到它并在自动模式下执行web serfing。我无法找出为什么发生这种情况,所以我只是显示代码片段。在这里它是:失败枚举shellwindows实例
#include "stdafx.h"
#include <Windows.h>
#include <Exdisp.h>
#include <comutil.h>
#pragma comment(lib, "comsuppw.lib")
int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwError;
IShellWindows *psw;
HRESULT hr = CoInitialize(NULL);
hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (void **)&psw);
if (!SUCCEEDED(hr))
{
dwError = GetLastError();
printf("Error: %d\n", dwError);
return 0;
}
IWebBrowser2* pBrowser2 = 0;
long nCount = 0;
hr = psw->get_Count(&nCount);
printf("%d\n", nCount);
for (long i = 0; i < nCount; i++)
{
_variant_t va(i, VT_I4);
IDispatch *spDisp;
hr = psw->Item(va, &spDisp);
hr = spDisp->QueryInterface(IID_IWebBrowserApp, (void**)&pBrowser2);
if (SUCCEEDED(hr))
{
BSTR name;
pBrowser2->get_FullName(&name);
if (wcsstr(name, L"IEXPLORE.EXE"))
{
wprintf(L"%ls\n", name);
break;
}
}
}
psw->Release();
VARIANT vEmpty;
VariantInit(&vEmpty);
_variant_t URL;
//URL.SetString("http://googl.ecom");
pBrowser2->Navigate2(&URL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
Sleep(2000);
//pBrowser2->GoBack();
pBrowser2->GoBack();
Sleep(2000);
pBrowser2->GoBack();
//pBrowser2->GoForward();
//pBrowser2->GoForward();
getchar();
return 0;
}
这里是行,其中execption发生
hr = spDisp->QueryInterface(IID_IWebBrowserApp, (void**)&pBrowser2);
调试器显示spDisp是NULL。我试图搜索关于该问题的一些信息,但没有真正发现线索。问题在哪里?感谢您的时间!
'HR = psw->项目(VA,与spDisp);' - 什么是背后存储'HRESULT',然后未能评估错误或成功的理由?由于不一致的错误检查,我建议阅读[错误处理在COM](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679692.aspx)。 – IInspectable
它应该是'(void **)&pBrowser2'不是'(void)&pBrowser2'。也许你只是想'ShellExecute'打开一个网站?否则在简单的WinAPI中浏览器控制是非常困难的。你不能在控制台窗口中完成。 –
@BarmakShemirani,是的,从一开始就是(无效**)。这是标记错误。不,我需要附加到现有的实例并浏览它。该代码看起来不是很困难,或者你的意思是什么? –