0

我正在处理浏览器帮助器对象,我正在尝试访问触发事件的 IWebBrowser2。使用 NavigateComplete2 和其他事件,我可以轻松做到这一点,因为我获得了 Invoke 参数上的指针。

但是我在 msdn 上读到了这篇文章,它说 TitleChange 事件的唯一参数是标题,那么如何从事件 TitleChange 中获取指向 webbrowser 界面的指针?

以下是我如何通过其他活动获得它:

HRESULT STDMETHODCALLTYPE CSiteEvents::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, 
                                         DISPPARAMS __RPC_FAR *Params, VARIANT __RPC_FAR *pVarResult, 
                                         EXCEPINFO __RPC_FAR *pExcepInfo, UINT __RPC_FAR *puArgErr )
{
    switch ( dispIdMember )
    {
        case DISPID_DOCUMENTCOMPLETE:
        {
            IWebBrowser2 *pBrowser = GetBrowser(Params->rgvarg[1]);
            // stuff
            pBrowser->Release();
        }
        break;
    }
}

IWebBrowser2* GetBrowser(const VARIANT &_Argument)
{
    IWebBrowser2 *pBrowser = NULL;

    if (_Argument.vt == VT_DISPATCH)
    {
        HRESULT hr;
        IDispatch *pDisp = _Argument.pdispVal;

        if (pDisp)
        {
            hr = pDisp->QueryInterface( IID_IWebBrowser2, reinterpret_cast<void **>(&pBrowser) );
            if ( FAILED(hr) )
                pBrowser = NULL;
        }
    }

    return pBrowser;
}

我正在使用 Visual Studio 2010。

4

2 回答 2

0

这里的上下文不是IDispatch隐含的吗?对于其他事件,您必须区分事件发生在控件中的位置,而TitleChange它位于顶层 - 这意味着this可以IDispatch*查询以获得您需要的接口。

DWebBrowserEvents2继承自窗口的每个组件,IDispatch但也封装了另一个IDispatch

于 2010-11-07T13:50:11.723 回答
0

标题只能在主窗口中更改,因此您可以使用从 IUnknown 检索到的 IWebBrowser2,并传递给您的 SetSite 实现。

STDMETHODIMP CMyBHO::SetSite(IUnknown *punkSite)
{
    if(punkSite != NULL)
    {
        // CComPtr<IWebBrowser2> m_pWebBrowser is member of CMyBHO class
        CComQIPtr<IServiceProvider> pServiceProvider = punkSite;
        if(pServiceProvider != NULL)
            pServiceProvider->QueryService(SID_SWebBrowserApp, IID_IWebBrowser2, (void**)&m_pWebBrowser);   
    }
    else
    {
        if(m_pWebBrowser != NULL)
        {
            m_pWebBrowser = NULL;
        }
    }
    return IObjectWithSiteImpl<CMyBHO>::SetSite(punkSite);
}
于 2011-05-11T18:00:03.807 回答