为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?

Posted

技术标签:

【中文标题】为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?【英文标题】:Why would my BHO fail to obtain IWebBrowser2 pointer inside IObjectWithSite::SetSite()?为什么我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针? 【发布时间】:2021-01-08 14:37:58 【问题描述】:

我看过许多 BHO 示例,我尝试实现这个常见场景:

STDMETHODIMP CBhoImpl::SetSite(IUnknown* pSite)

    if (NULL != pSite)
    
        CComQIPtr<IWebBrowser2> webBrowser(pSite);
        // webBrowser should hold a non-null pointer here
        // but it holds a null pointer instead

        //whatever
    
    // whatever

SetSite() 被调用并进入了if 分支,但QueryInterface() 未能检索到IWebBrowser2

我已经看到很多例子完全一样。

我做错了什么?

【问题讨论】:

【参考方案1】:

尝试在IUnknown参数中查询IServiceProvider,如果成功则可以调用其QueryService()方法获取IWebBrowser2,例如:

STDMETHODIMP CBhoImpl::SetSite(IUnknown* pSite)

    if (pSite)
    
        CComPtr<IWebBrowser2> webBrowser;

        CComQIPtr<IServiceProvider> pServiceProvider(pSite);
        if (pServiceProvider)
        
            pServiceProvider->QueryService(SID_SWebBrowserApp, IID_PPV_ARGS(&webBrowser));
        
        else
        
            webBrowser = CComQIPtr<IWebBrowser2>(pSite);
        

        if (webBrowser)
        
            // use webBrowser as needed...
        
    

【讨论】:

以上是关于为啥我的 BHO 无法在 IObjectWithSite::SetSite() 中获取 IWebBrowser2 指针?的主要内容,如果未能解决你的问题,请参考以下文章

BHO 和服务之间的 C# IPC

无法使用 Visual Studio 2010 调试 C++ BHO DLL

如何用普通 C++ 编写一个执行我的 javascript 的 IE BHO

BHO:onload 完成执行时收到通知

ActiveX 或 BHO(Internet Explorer)

从 Javascript 调用 BHO 方法?