Poignée HTMLElementEvents2 lorsque DWebBrowserEvents2 a été traitée en utilisant les macros de ATL

StackOverflow https://stackoverflow.com/questions/1106659

Question

Je crée un objet Helper navigateur à l'aide VS2008, C ++. Ma classe est dérivé de IDispEventImpl parmi beaucoup d'autres

class ATL_NO_VTABLE CHelloWorldBHO :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CHelloWorldBHO, &CLSID_HelloWorldBHO>,
    public IObjectWithSiteImpl<CHelloWorldBHO>,
    public IDispatchImpl<IHelloWorldBHO, &IID_IHelloWorldBHO, &LIBID_HelloWorldLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IDispEventImpl<1, CHelloWorldBHO, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>

{
.
.
.
BEGIN_SINK_MAP(CHelloWorldBHO)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
     SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2
END_SINK_MAP()
.
.
.
}

Comme il ressort du code ci-dessus, mes DWebBrowserEvents2 sont traitées à l'aide des macros de l'ATL. Maintenant, je veux gérer HTMLElementEvents2 (pour détecter les clics, les barres de défilement, etc.) Pour cela, je QueryInterface () l'objet IHTMLDocument2 pour IHTMLElement, QueryInterface () que pour IConnectionPointContainer et appeler IConnectionPointContainer :: FindConnectionPoint (DIID_HTMLElementEvents2). (Voir article sur la manipulation HTMLElementEvents2 de msdn). Le problème est, quand j'Ecraser IDispatch :: Invoke dans ma classe, les poignées DWebBrowserEvents2 (créées à l'aide de macros ATL) échouent. Y at-il un moyen de gérer HTMLElementEvents2 sans écraser Invoke, ou mettre en œuvre de telle invoquer manière qu'il ne gère que HTMLElementEvents2?
Merci, Toute aide sera appréciée.

Était-ce utile?

La solution

Il n'y a pas vraiment besoin de passer outre Invoke ou obtenir IConnectionPointContainer. Étant donné que c'est un projet ATL, une autre mise en œuvre IDispEventImpl:

public IDispEventImpl<2, CHelloWorldBHO, &DIID_HTMLTextContainerEvents2, &LIBID_MSHTML, 4, 0>

fait le tour. Ensuite, enfoncer l'entrée comme:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

Dans OnDocumentComplete, appelez IWebBrowser2 :: get_document, IHTMLDocument2 :: get_body, puis appelez DispEventAdvise pour commencer à recevoir des événements.

Notez que je l'ai utilisé DIID_HTMLTextContainerEvents2 au lieu de DIID_HTMLElementEvents. En effet, l'objet de corps ne supporte pas HTMLElementEvents2, et mon but (pour gérer le défilement) cela fonctionne très bien!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top