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

问题描述

我已经看到了许多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...
        }
    }
}