2015-11-12 148 views
0

我試圖訪問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。我試圖搜索關於該問題的一些信息,但沒有真正發現線索。問題在哪裏?感謝您的時間!

+0

'HR = psw->項目(VA,與spDisp);' - 什麼是背後存儲'HRESULT',然後未能評估錯誤或成功的理由?由於不一致的錯誤檢查,我建議閱讀[錯誤處理在COM](https://msdn.microsoft.com/en-us/library/windows/desktop/ms679692.aspx)。 – IInspectable

+0

它應該是'(void **)&pBrowser2'不是'(void)&pBrowser2'。也許你只是想'ShellExecute'打開一個網站?否則在簡單的WinAPI中瀏覽器控制是非常困難的。你不能在控制檯窗口中完成。 –

+0

@BarmakShemirani,是的,從一開始就是(無效**)。這是標記錯誤。不,我需要附加到現有的實例並瀏覽它。該代碼看起來不是很困難,或者你的意思是什麼? –

回答

1

你的代碼應該這樣寫。 (我不保證結果)

#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); 
     if(SUCCEEDED(hr)){ 
      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); 

        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->Release(); 
      } 
     } 
    } 
    psw->Release(); 

    getchar(); 
    return 0; 
} 
+0

爲什麼你忽略錯誤處理? – IInspectable

+0

@IInspectable,COM中的錯誤報告不僅僅是檢查GetLastError();它有點複雜,這就是爲什麼它被忽略了。 – milevyo

+0

如果您發現COM錯誤處理(這可能是最簡單的錯誤處理),那麼您可能不應該試圖回答關於此主題的問題。具體來說,我指的是'HRESULT hr = CoInitialize(NULL);'。爲什麼存儲返回值,然後無法評估? – IInspectable