我試圖訪問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,是的,從一開始就是(無效**)。這是標記錯誤。不,我需要附加到現有的實例並瀏覽它。該代碼看起來不是很困難,或者你的意思是什麼? –