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

Why would my BHO fail to obtain IWebBrowser2 pointer inside IObjectWithSite::SetSite()?

我看过很多 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.

我见过很多例子完全一样。

我做错了什么?

尝试查询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...
        }
    }
}