Получение указателя IWebBrowser2 из события DISPID_TITLECHANGE - PullRequest
0 голосов
/ 07 ноября 2010

Я работаю над объектом Browser Helper, и я пытаюсь получить доступ к IWebBrowser2, который запускает событие. С NavigateComplete2 и другими событиями я могу легко сделать это, потому что я получаю указатель на параметры Invoke.

Но я читал это в msdn, и там говорится, что единственным параметром для события TitleChange является заголовок, поэтому как мне получить указатель на интерфейс веб-браузера из события TitleChange?

Вот как я получаю это с другими событиями:

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.

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Заголовок можно изменить только в главном окне, поэтому вы можете использовать IWebBrowser2, извлеченный из IUnknown, переданный вашей реализации 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);
}
0 голосов
/ 07 ноября 2010

Не является ли контекст IDispatch здесь неявным?С другими событиями вы должны различать местонахождение элемента управления, в котором произошло событие, в то время как для TitleChange оно находится на верхнем уровне - это означает, что this - это IDispatch*, к которому можно обратиться, чтобы получить нужный вам интерфейс.

DWebBrowserEvents2 наследуется от IDispatch, но также инкапсулирует еще IDispatch для каждого компонента окна.

...