Event Handling Principles
Es gibt drei Schritte, die auf alle Ereignisbehandlung gemeinsam sind. Sie benötigen:
Implementieren Sie die Ereignisschnittstelle für das Objekt.
Melden Sie sich die Ereignisquelle an, dass das Objekt Ereignisse empfangen will.
Melden Sie sich die Ereignisquelle wenn die Anforderungen des Objekts nicht mehr, Ereignisse empfangen ab.
Die Methode, der Sie die Ereignisschnittstelle implementieren, hängt von seinem Typ ab. Eine Ereignisschnittstelle kann vtable, dual oder eine Dispatchschnittstelle sein. Sie ist bis zum Designer der Ereignisquelle, um die Schnittstelle zu definieren, sie hängt, um diese Schnittstelle zu implementieren.
Hinweis
Obwohl keine technischen Gründen gibt an, dass eine Ereignisschnittstelle nicht dual sein kann, gibt es einige gute entwicklungsspezifischen Gründe, die Verwendung von zu vermeiden verdoppelt.Dies ist jedoch eine Entscheidung, die vom Designer/die Implementierung der Ereignisquelle erfüllt ist.Wenn Sie aus der Sicht des Ereignisses sink arbeiten, müssen Sie die Wahrscheinlichkeit zulassen, dass Sie möglicherweise keine Auswahl haben, aber eine duale Ereignisschnittstelle implementieren.Weitere Informationen zu dualen Schnittstellen, finden Sie unter Duale Schnittstellen und ATL.
Die Anmeldung der Ereignisquelle kann in drei Schritte aufgegliedert werden:
Fragen Sie das Quellobjekt für IConnectionPointContainer ab.
Rufen Sie IConnectionPointContainer::FindConnectionPoint auf, das die IID der Ereignisschnittstelle übergeben wird, die für Sie. Wenn erfolgreich, gibt dies die die IConnectionPoint-Schnittstelle-Schnittstelle in einem Verbindungspunktobjekt zurück.
Rufen Sie IConnectionPoint::Advise auf, das IUnknown der Ereignissenke übergibt. Wenn erfolgreich, gibt dieses DWORD ein Cookie zurück, das die Verbindung darstellt.
Sobald Sie erfolgreich das Interesse registriert haben, an, Ereignisse zu empfangen, werden Methoden auf der Ereignisschnittstelle des Objekts entsprechend den Ereignissen aufgerufen, die durch das Quellobjekt ausgelöst werden. Wenn Sie nicht mehr Ereignisse empfangen müssen, können Sie das Cookie zurück zu dem Verbindungspunkt über IConnectionPoint::Unadvise übergeben. Dieses unterbricht die Verbindung zwischen Quelle und Senke.
Achten Sie darauf, dass Sie Bezugszyklen vermeiden, wenn Sie Ereignisse behandeln.