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]
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. –
OOps, ich dachte, ich hätte den Link schon gepostet. Es ist jetzt da. – GotAmye