从事件 DISPID_TITLECHANGE 获取 IWebBrowser2 指针

发布于 2024-10-01 16:37:32 字数 1397 浏览 6 评论 0原文

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

但我在 msdn 上阅读 this说 TitleChange 事件的唯一参数是标题,那么如何从 TitleChange 事件获取指向 Web 浏览器界面的指针?

以下是我如何通过其他事件获取它:

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 。

Im working on a Browser Helper Object, and I am trying to access the IWebBrowser2 that fires an event. With NavigateComplete2 and other events I can easly do it because I get the pointer on the parameters of Invoke.

But I was reading this on msdn and it says the only parameter for TitleChange event is the title, so how do I get the pointer to the webbrowser interface from the event TitleChange?

Here's how I am getting it with other events:

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

I am using Visual Studio 2010.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

违心° 2024-10-08 16:37:32

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

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

Isn't the IDispatch context here implicit? With the other events, you have to distinguish whereabouts in the control the event happened, while for TitleChange it's at the top level - this means this is an IDispatch* that can be queried to get the interface you need.

DWebBrowserEvents2 inherits from IDispatch but also encapsulate another IDispatch for each component of the window.

胡渣熟男 2024-10-08 16:37:32

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

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);
}

Title can be changed only in main window, so you can use IWebBrowser2, retrieved from IUnknown passed to your SetSite implementation.

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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文