2015-11-12 52 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