2010-11-07 4 views
0

Je travaille sur un objet d'aide du navigateur et j'essaie d'accéder à IWebBrowser2 qui déclenche un événement. Avec NavigateComplete2 et d'autres événements, je peux facilement le faire car j'obtiens le pointeur sur les paramètres de Invoke.Obtention du pointeur IWebBrowser2 à partir de l'événement DISPID_TITLECHANGE

Mais je lisais this sur msdn et il dit que le seul paramètre pour l'événement TitleChange est le titre, alors comment puis-je le pointeur à l'interface du navigateur Web de l'événement TitleChange?

Voici comment je reçois avec d'autres événements:

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

J'utilise Visual Studio 2010.

Répondre

0

est-ce pas le contexte IDispatch ici implicite? Avec les autres événements, vous devez distinguer où se trouve l'événement, alors que pour TitleChange c'est au niveau supérieur - cela signifie que this est un IDispatch* qui peut être interrogé pour obtenir l'interface dont vous avez besoin.

DWebBrowserEvents2 hérite de IDispatch mais encapsule également un autre IDispatch pour chaque composant de la fenêtre.

+0

Voulez-vous dire que je devrais pouvoir utiliser: IWebBrowser2 * pBrowser = NULL; \t \t \t this-> QueryInterface (IID_IWebBrowser2, reinterpret_cast (& pBrowser)) ;? J'ai essayé cela et pBrowser est NULL. – gtilx

+0

C'est ce que je pensais que cela devrait fonctionner - désolé que ce ne soit pas le cas ... Que se passe-t-il lorsque vous essayez ceci en utilisant l'UUID pour 'IDispatch'? –

+0

Comment puis-je utiliser l'UUID? avez-vous un exemple? – gtilx

0

Le titre peut être modifié uniquement dans la fenêtre principale, vous pouvez donc utiliser IWebBrowser2, récupéré à partir de IUnknown, transmis à votre implémentation 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); 
} 
Questions connexes