【问题标题】:IWebBrowser2.Document not returning IHTMLDocument2IWebBrowser2.Document 不返回 IHTMLDocument2
【发布时间】:2016-07-28 20:56:57
【问题描述】:

我正在尝试将 IWebBrowser2 COM 对象转换为 IHTMLDocument2,以便我可以操作 IE Web 浏览器的内容。

这是我的代码的开始:

int main()
{
    if (SUCCEEDED(OleInitialize(NULL)))
    {
        CComQIPtr<IWebBrowser2> pBrowser2;
        CComQIPtr<IDispatch> pDispatch;

        CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER,
            IID_IWebBrowser2, (void**)&pBrowser2);
        if (pBrowser2)
        {    
            //Here, pDispatch remains null and hr == E_FAIL
            HRESULT hr = pBrowser2->get_Document(&pDispatch);
        }
        OleUninitialize();
    }    
}

在调用 IWebBrowser2::get_Document() 时,pDispatch 变量保持为空,返回的 HRESULT 为 E_FAIL。

我需要做什么才能从 IWebBrowser2 获取 IHTMLDocument2 对象?

【问题讨论】:

    标签: c++ windows internet-explorer com


    【解决方案1】:

    先拨打Navigate打开网页。否则没有文件可取。

    if (pBrowser2)
    {
        VARIANT vEmpty;
        VariantInit(&vEmpty);
    
        BSTR str = SysAllocString(L"http://google.com");
        HRESULT hr = pBrowser2->Navigate(str , &vEmpty, &vEmpty, &vEmpty, &vEmpty);
        if (SUCCEEDED(hr))
        {
            //optional: show the explorer window
            //pBrowser2->put_Visible(VARIANT_TRUE);
    
            hr = pBrowser2->get_Document(&pDispatch);
            if (hr == S_OK)
                OutputDebugStringW(L"okay\n");
        }
    
        SysFreeString(str);
        pBrowser2->Quit();
    }
    

    【讨论】:

    • 试过了,不能解决我遇到的问题。我是否可能在我的环境中遗漏了什么?我正在尝试作为管理员,所以我认为这不是权限问题。
    • 在玩弄它之后,我意识到它需要等到文档完全加载。为了测试,我只是扔了一个 Sleep(5000) 然后它就起作用了。我需要了解如何捕获文档加载事件,但现在您已经回答了我的问题,谢谢!
    • 哦,我错过了,因为我在调试器中单步执行,没有注意到它需要延迟。将浏览器控件放在您自己的窗口中并更改其内容怎么样?我认为这应该更容易。
    猜你喜欢
    • 2012-12-18
    • 2011-11-14
    • 2016-03-08
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2020-01-17
    • 2015-02-23
    • 2015-09-17
    相关资源
    最近更新 更多