【问题标题】: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

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

我做错了什么?

【问题讨论】:

    标签: c++ internet-explorer com bho 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...
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 2011-12-23
      • 2011-05-06
      • 1970-01-01
      • 2010-12-20
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多