Frage

Ich erstelle einen Browser Helper Object mit VS2008, C ++. Meine Klasse hat sich von IDispEventImpl unter vielen anderen abgeleitet

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()
.
.
.
}

Wie aus dem obigen Code, mein DWebBrowserEvents2 behandelt wird die Makros ATL verwenden. Jetzt möchte ich HTMLElementEvents2 (erkennen Klicks, Bildlaufleisten, etc.) Für das, ich Query-Interface () das IHTMLDocument2 Objekt für IHTMLElement, Query-Interface (), dass für IConnectionPointContainer und rufen IConnectionPointContainer :: Findconnectionpoint (DIID_HTMLElementEvents2) zu handhaben. (Siehe Msdn des Artikel zum Umgang mit HTMLElementEvents2). Das Problem ist, wenn ich IDispatch :: Invoke in meiner Klasse überschreiben, die DWebBrowserEvents2 Griffe (mit ATL-Makros erstellt) fehlschlagen. Gibt es eine Möglichkeit HTMLElementEvents2 zu handhaben, ohne Invoke überschreiben oder implementieren so aufrufen, dass es nur Griffe HTMLElementEvents2?
Danke, Jede Hilfe wird geschätzt.

War es hilfreich?

Lösung

Es gibt keine wirkliche Notwendigkeit, außer Kraft zu setzen Invoke oder erhalten IConnectionPointContainer. Da es sich um ein ATL-Projekt, Implementierung eines anderen IDispEventImpl:

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

funktioniert der Trick. Dann sinkt die Eingabe als:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll)

In OnDocumentComplete, rufen IWebBrowser2 :: Get_Document, IHTMLDocument2 :: get_body und dann DispEventAdvise rufen Ereignisse beginnen zu empfangen.

Beachten Sie, dass ich DIID_HTMLTextContainerEvents2 statt DIID_HTMLElementEvents benutzt habe. Das ist, weil der Körper Objekt nicht HTMLElementEvents2 unterstützen, und für meine Zwecke (zu behandeln Scrollen) das funktioniert ganz gut!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top