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

98 Views Asked by At

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?

1

There are 1 best solutions below

0
On BEST ANSWER

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