Unterstützen von IDispEventImpl
Die Vorlagenklasse IDispEventImpl kann verwendet werden, um Unterstützung für Verbindungspunktsenken in Ihrer ATL-Klasse bereitzustellen. Mit einer Verbindungspunktsenke kann Ihre Klasse Ereignisse behandeln, die von externen COM-Objekten ausgelöst werden. Diese Verbindungspunktsenken werden mit einer Ereignissenkenzuordnung zugeordnet, die von Ihrer Klasse bereitgestellt wird.
Um eine Verbindungspunktsenke für Ihre Klasse ordnungsgemäß zu implementieren, müssen die folgenden Schritte ausgeführt werden:
Importieren der Typbibliotheken für jedes externe Objekt
Deklarieren der
IDispEventImpl
SchnittstellenDeklarieren einer Ereignissenkenzuordnung
Raten und Aufheben der Benachrichtigung der Verbindungspunkte
Die Schritte zum Implementieren einer Verbindungspunktsenke werden alle durchgeführt, indem nur die Headerdatei (H) Ihrer Klasse geändert wird.
Importieren der Typbibliotheken
Für jedes externe Objekt, dessen Ereignisse Sie behandeln möchten, müssen Sie die Typbibliothek importieren. Dieser Schritt definiert die Ereignisse, die behandelt werden können, und stellt Informationen bereit, die beim Deklarieren der Ereignissenkenzuordnung verwendet werden. Die #import-Direktive kann verwendet werden, um dies zu erreichen. Fügen Sie die erforderlichen #import
Direktivenzeilen für jede Dispatch-Schnittstelle hinzu, die Sie der Headerdatei (H) Ihrer Klasse unterstützen.
Im folgenden Beispiel wird die Typbibliothek eines externen COM-Servers importiert (MSCAL.Calendar.7
):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Hinweis
Sie müssen über eine separate #import
Anweisung für jede externe Typbibliothek verfügen, die Sie unterstützen.
Deklarieren der IDispEventImpl-Schnittstellen
Nachdem Sie nun die Typbibliotheken jeder Verteilerschnittstelle importiert haben, müssen Sie separate IDispEventImpl
Schnittstellen für jede externe Verteilerschnittstelle deklarieren. Ändern Sie die Deklaration Ihrer Klasse, indem Sie für jedes externe Objekt eine IDispEventImpl
Schnittstellendeklaration hinzufügen. Weitere Informationen zu den Parametern finden Sie unter "IDispEventImpl".
Der folgende Code deklariert zwei Verbindungspunktsenken für die Schnittstelle für das von der DCalendarEvents
Klasse CMyCompositCtrl2
implementierte COM-Objekt:
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
Deklarieren einer Ereignissenkenzuordnung
Damit die Ereignisbenachrichtigungen von der richtigen Funktion behandelt werden können, muss die Klasse jedes Ereignis an den richtigen Handler weiterleiten. Dies wird durch Deklarieren einer Ereignissenkenzuordnung erreicht.
ATL bietet mehrere Makros, BEGIN_SINK_MAP, END_SINK_MAP und SINK_ENTRY_EX, die diese Zuordnung vereinfachen. Das Standardformat lautet wie folgt:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
Im folgenden Beispiel wird eine Ereignissenkenzuordnung mit zwei Ereignishandlern deklariert:
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
Die Implementierung ist fast abgeschlossen. Der letzte Schritt betrifft die Beratung und Nichtbewaufsichtung der externen Schnittstellen.
Beratung und Aufhebung der IDispEventImpl-Schnittstellen
Der letzte Schritt besteht darin, eine Methode zu implementieren, die alle Verbindungspunkte zu den richtigen Zeiten berät (oder nicht zu beachten). Diese Beratung muss erfolgen, bevor die Kommunikation zwischen den externen Clients und Ihrem Objekt erfolgen kann. Bevor das Objekt sichtbar wird, wird jede externe Verteilerschnittstelle, die von Ihrem Objekt unterstützt wird, für ausgehende Schnittstellen abgefragt. Es wird eine Verbindung hergestellt, und ein Verweis auf die ausgehende Schnittstelle wird verwendet, um Ereignisse aus dem Objekt zu behandeln. Dieses Verfahren wird als "Beratung" bezeichnet.
Nachdem das Objekt mit den externen Schnittstellen fertig gestellt wurde, sollten die ausgehenden Schnittstellen benachrichtigt werden, dass sie von Der Klasse nicht mehr verwendet werden. Dieser Prozess wird als "nicht zu überwachen" bezeichnet.
Aufgrund der eindeutigen Art von COM-Objekten variiert dieses Verfahren im Detail und der Ausführung zwischen Implementierungen. Diese Details liegen außerhalb des Umfangs dieses Themas und werden nicht behandelt.