【问题标题】:Getting IWebBrowser2 pointer from event DISPID_TITLECHANGE从事件 DISPID_TITLECHANGE 获取 IWebBrowser2 指针
【发布时间】:2011-05-06 05:04:22
【问题描述】:

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

但我在 msdn 上阅读 this,它说 TitleChange 事件的唯一参数是标题,所以 我如何从事件 TitleChange 中获取指向 webbrowser 界面的指针? p>

这是我在其他活动中获得它的方式:

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。

【问题讨论】:

    标签: c++ events bho iwebbrowser2 ihtmldocument2


    【解决方案1】:

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

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

    【讨论】:

    • 你的意思是我应该可以使用:IWebBrowser2 *pBrowser = NULL; this->QueryInterface(IID_IWebBrowser2, reinterpret_cast(&pBrowser));?我试过了,pBrowser 是 NULL。
    • 这就是我认为应该工作的 - 抱歉没有这样做......当您使用 IDispatch 的 UUID 尝试此操作时会发生什么?
    • 如何使用 UUID?你有例子吗?
    【解决方案2】:

    标题只能在主窗口中更改,因此您可以使用从 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2014-06-16
      • 1970-01-01
      • 2016-08-01
      相关资源
      最近更新 更多