Freigeben über


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 sinkarbeiten, 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 IConnectionPointContainer.

  • Rufen Sie IConnectionPointContainer::FindConnectionPoint auf, indem Sie die IID der Ereignisschnittstelle übergeben, die Sie interessiert. Wenn dies erfolgreich verläuft, wird die IConnectionPoint-Schnittstelle für ein Verbindungspunktobjekt zurückgegeben.

  • Rufen Sie IConnectionPoint::Advise auf, indem Sie die IUnknown Ereignissenke übergeben. Bei erfolgreicher Ausführung gibt dies ein DWORD 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 IConnectionPoint::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.

Siehe auch

Ereignisbehandlung