c++internet-explorercombhoiwebbrowser2

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


I've seen a number of BHO samples and I try to implement this common scenario:

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() is invoked and the if branch is entered but QueryInterface() fails to retrieve IWebBrowser2.

I've seen a number of examples doing exactly the same.

What am I doing wrong?


Solution

  • Try querying the IUnknown parameter for IServiceProvider, and if successful then you can call its QueryService() method to get the IWebBrowser2, eg:

    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...
            }
        }
    }