2009-07-09 6 views
1

Ich erstelle ein Browser Helper-Objekt mit VS2008, C++. Meine Klasse hat sich unter vielen anderen von IDispEventImpl abgeleitetBehandle HTMLElementEvents2, wenn DWebBrowserEvents2 mit ATLs Makros behandelt wurde

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, meine DWebBrowserEvents2 behandelt werden die Makros ATL verwenden. Jetzt möchte ich HTMLElementEvents2 behandeln (um Klicks, Bildlaufleisten usw. zu erkennen). Dazu benutze ich QueryInterface() das IHTMLDocument2-Objekt für IHTMLElement, QueryInterface() das für IConnectionPointContainer und rufe IConnectionPointContainer :: FindConnectionPoint (DIID_HTMLElementEvents2) auf. (Siehe msdn's article zum Umgang mit HTMLElementEvents2). Das Problem ist, wenn ich IDispatch :: Invoke in meiner Klasse überschreiben, die DWebBrowserEvents2 behandelt (erstellt mit ATL-Makros) fehlschlagen. Gibt es eine Möglichkeit, mit HTMLElementEvents2 umzugehen, ohne Invoke zu überschreiben, oder den Aufruf so zu implementieren, dass nur HTMLElementEvents2 gehandhabt wird?
Danke, Jede Hilfe wird geschätzt.

Antwort

1

Es gibt keine Notwendigkeit, Invoke oder IConnectionPointContainer zu überschreiben. Da es sich um ein ATL-Projekt handelt, führt das Implementieren eines weiteren IDispEventImpl:

den Trick. Dann sinken den Eintrag als:

SINK_ENTRY_EX(2, DIID_HTMLTextContainerEvents2, DISPID_ONSCROLL, OnScroll) 

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

Beachten Sie, dass ich DIID_HTMLTextContainerEvents2 anstelle von DIID_HTMLElementEvents verwendet habe. Das ist, weil das Körper-Objekt HTMLElementEvents2 nicht unterstützt, und für meinen Zweck (um Scrollen zu handhaben) funktioniert das gut!

+0

Hallo GotAmye, ich versuche auch, ein BHO zu schreiben, um Data Mining-Zwecke zu behandeln. Aber ich habe ein Problem, wo Inhalte mit Javascript gefüllt werden. Lassen Sie uns sagen, wenn Sie so etwas wie '

'haben, wo' table' von JS generiert wird und wie Sie den Inhalt der Tabelle erhalten. Gibt es ein Ereignis für DHTML oder eine andere Möglichkeit? Bitte schlagen Sie ... Danke p.s. Ich habe die Frage hier geschrieben. 'Http://stackoverflow.com/questions/3298160/how-to-get-complete-html-body-using-browser-helper-object-bho-in-case-of-dhtml ' – Favonius