Ereignisbehandlungsrichtlinien
Es gibt drei Schritte, die für alle Ereignisbehandlungen gemeinsam sind. Folgendes ist erforderlich:
Implementieren Sie die Ereignisschnittstelle für Ihr Objekt.
Empfehlen Sie der Ereignisquelle, dass Ihr Objekt Ereignisse empfangen möchte.
Heben Sie die Benachrichtigung der Ereignisquelle auf, wenn ihr Objekt keine Ereignisse mehr empfangen muss.
Die Art und Weise, wie Sie die Ereignisschnittstelle implementieren, hängt vom Typ ab. Eine Ereignisschnittstelle kann vtable, dual oder eine dispinterface sein. Es liegt an dem Designer der Ereignisquelle, die Schnittstelle zu definieren; es liegt an Ihnen, diese Schnittstelle zu implementieren.
Hinweis
Obwohl es keine technischen Gründe gibt, dass eine Ereignisschnittstelle nicht dual sein kann, gibt es eine Reihe guter Entwurfsgründe, um die Verwendung von Duals zu vermeiden. Dies ist jedoch eine Entscheidung des Designers/Implementierers der Ereignisquelle. Da Sie aus der Perspektive des Ereignisses sink
arbeiten, müssen Sie die Möglichkeit zulassen, dass Sie möglicherweise keine Wahl haben, sondern eine duale Ereignisschnittstelle implementieren. Weitere Informationen zu dualen Schnittstellen finden Sie unter Dual Interfaces und ATL.
Die Beratung der Ereignisquelle kann in drei Schritte unterteilt werden:
Abfragen des Quellobjekts für I Verbinden ionPointContainer.
Rufen Sie I Verbinden ionPointContainer::Find Verbinden ionPoint auf, indem Sie die IID der Ereignisschnittstelle übergeben, die Sie interessiert. Wenn dies erfolgreich verläuft, wird die I Verbinden ionPoint-Schnittstelle für ein Verbindungspunktobjekt zurückgegeben.
Rufen Sie I Verbinden ionPoint::Empfehlen Sie, die
IUnknown
Ereignissenke zu übergeben. Bei erfolgreicher Ausführung gibt dies einDWORD
Cookie zurück, das die Verbindung darstellt.
Nachdem Sie ihr Interesse am Empfangen von Ereignissen erfolgreich registriert haben, werden Methoden auf der Ereignisschnittstelle Des Objekts entsprechend den Vom Quellobjekt ausgelösten Ereignissen aufgerufen. Wenn Sie keine Ereignisse mehr empfangen müssen, können Sie das Cookie über I Verbinden ionPoint::Unadvise wieder an den Verbindungspunkt übergeben. Dadurch wird die Verbindung zwischen Quelle und Sink getrennt.
Achten Sie darauf, beim Behandeln von Ereignissen Referenzzyklen zu vermeiden.