2009-07-14 6 views
1

Vom msdn websiteAdvise HTMLElementEvents2 Enke (MSDN-Website)

void CMyClass::ConnectEvents(IHTMLElement* pElem) 
{ 
    HRESULT hr; 
    IConnectionPointContainer* pCPC = NULL; 
    IConnectionPoint* pCP = NULL; 
    DWORD dwCookie; 

    // Check that this is a connectable object. 
    hr = pElem->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC); 

    if (SUCCEEDED(hr)) 
    { 
     // Find the connection point. 
     hr = pCPC->FindConnectionPoint(DIID_HTMLElementEvents2, &pCP); 

     if (SUCCEEDED(hr)) 
     { 
      // Advise the connection point. 
      // pUnk is the IUnknown interface pointer for your event sink 
      hr = pCP->Advise(pUnk, &dwCookie); 

      if (SUCCEEDED(hr)) 
      { 
       // Successfully advised 
      } 

      pCP->Release(); 
     } 

     pCPC->Release(); 
    } 
} 

Wie kann ich den pUnk Zeiger bekommen? Ich habe CComObject * pUnk als globale Variable definiert und initialisiere sie als CComObject :: CreateInstance (& pUnk); Ich benutze dann so definiert pUnk in dem Code über die folgenden Fehler gibt:

Fehler 1 Fehler C2065: 'm_dwRef': undeclared Kennung c: \ Programme \ Microsoft Visual Studio 9.0 \ vc \ atlmfc \ include \ atlcom. h 2575

Fehler 2 Fehler C3861: 'Finalrelease': Bezeichner nicht gefunden c: \ program files Microsoft Visual Studio 9.0 \ vc \ \ atlmfc \ \ include atlcom.h 2576

WHat auf die richtige Art und Weise wäre PUNK bekommen? Ein Beispielcode wäre sehr nützlich. Danke!

[Bearbeiten: Ich versuche, diesen Beispielcode in meiner IE-Erweiterung-Anwendung zu verwenden, die ATL verwendet, um HTMLElementEvents2 zu behandeln. Meine Klasse von IDispEventImpl leitet Web-Browser-Ereignisse zu behandeln und ich versuche, von einer anderen Instanz von IDispEventImpl abzuleiten HTMLElementEvents2

class ATL_NO_VTABLE CMyClass: 
    public CComObjectRootEx<CComSingleThreadModel>, 
    public CComCoClass<CSecurMailBHO, &CLSID_MyClass>, 
    public IObjectWithSiteImpl<CMyClass>, 
    public IDispatchImpl<ISecurMailBHO, &IID_IMyClass, &LIBID_MyClassLib, /*wMajor =*/ 1, /*wMinor =*/ 0>, 
    public IDispEventImpl<1, CMyClass, &DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>, //Safe alternative to Invoke 
    public IDispEventImpl<2, CMyClass, &DIID_HTMLElementEvents2, &LIBID_MSHTML, 4, 0> 
{ 
. 
. 
. 
BEGIN_SINK_MAP(CMyClass) 
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)//Do stuff OnDocumentComplete 
    SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, BeforeNavigate2)//Handle BeforeNavigate2 

    SINK_ENTRY_EX(2, DIID_HTMLElementEvents2, DISPID_HTMLELEMENTEVENTS2_ONSCROLL, OnScroll)//Handle OnScroll Event 

END_SINK_MAP() 
. 
. 

} 

In meinem OnDocumentComplete zu handhaben, ich nenne IWebBrowser2 :: Get_Document gefolgt von IHTMLDocument2 :: get_body erhalten der IHTMLElement-Objektkörper. Dies wird an die obige Funktion ConnectEvents gesendet. Aber bis jetzt, kein Glück. Ich weiß nicht, was der pUnk-Zeiger ist, und außerdem scheint der Aufruf von FindConnectionPoint fehlgeschlagen zu sein, d. H. Es gibt keinen HTMLElementEvents2-Verbindungspunkt im Punkt-Container. Irgendwelche Ideen, wie ich mit dem Umgang mit den htmllementevents weitermachen sollte ?????????

End Bearbeiten]

+0

Sie sollten den Feedback-Link auf der Seite verwenden, um MSDN zur Fehlerbehebung zu erhalten. Außerdem sollten Sie den Link zu dem Artikel veröffentlichen, der den Code enthält. –

+0

OOps, ich dachte, ich hätte den Link schon gepostet. Es ist jetzt da. – GotAmye

Antwort

0

ATLEventHandling Sample

Edit:

void CMyClass::ConnectEvents(IHTMLElement* pElem) 
{ 
    typedef IDispEventImpl<2, CMyClass, DIID_HTMLElementEvents2, LIBID_MSHTML, 4, 0> IMyClassHTMLElementEvents2Sink; 
    IMyClassHTMLElementEvents2Sink::DispEventAdvise(pElem); 
} 

Da Sie mehrere Funktionen DispEventAdvise auf der Basis IDispEventImpl Klassen haben.

Auch scheint es frühesten Version von MSHTML, HTMLElementEvents2 definiert ist 5.0.

+0

Hmm .... es ist ein gutes Beispiel, aber passt nicht in den Kontext von Internet Explorer Event Handling, und darum geht es mir ... Danke! – GotAmye

+0

Ja, das ist es, was ich am Ende mache. Vielen Dank! – GotAmye

Verwandte Themen