Obsługa interfejsu IDispEventImpl
Klasa szablonu IDispEventImpl może służyć do zapewnienia obsługi ujścia punktów połączenia w klasie ATL. Ujście punktu połączenia umożliwia klasie obsługę zdarzeń wyzwalanych z zewnętrznych obiektów COM. Te ujścia punktu połączenia są mapowane na mapę ujścia zdarzeń dostarczoną przez klasę.
Aby prawidłowo zaimplementować ujście punktu połączenia dla klasy, należy wykonać następujące kroki:
Importowanie bibliotek typów dla każdego obiektu zewnętrznego
Deklarowanie
IDispEventImpl
interfejsówDeklarowanie mapy ujścia zdarzeń
Doradzanie i nienadzorowywanie punktów połączenia
Wszystkie kroki związane z implementowaniem ujścia punktu połączenia są wykonywane przez zmodyfikowanie tylko pliku nagłówka (.h) klasy.
Importowanie bibliotek typów
Dla każdego obiektu zewnętrznego, którego zdarzenia mają być obsługiwane, należy zaimportować bibliotekę typów. Ten krok definiuje zdarzenia, które można obsłużyć, i udostępnia informacje używane podczas deklarowania mapy ujścia zdarzeń. Aby to osiągnąć, można użyć dyrektywy #import . Dodaj niezbędne #import
wiersze dyrektywy dla każdego interfejsu wysyłania, które będą obsługiwane do pliku nagłówka (.h) klasy.
Poniższy przykład importuje bibliotekę typów zewnętrznego serwera COM (MSCAL.Calendar.7
):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Uwaga
Musisz mieć oddzielną #import
instrukcję dla każdej biblioteki typów zewnętrznych, którą będziesz obsługiwać.
Deklarowanie interfejsów IDispEventImpl
Po zaimportowaniu bibliotek typów każdego interfejsu wysyłania należy zadeklarować oddzielne IDispEventImpl
interfejsy dla każdego interfejsu wysyłania zewnętrznego. Zmodyfikuj deklarację klasy, dodając deklarację IDispEventImpl
interfejsu dla każdego obiektu zewnętrznego. Aby uzyskać więcej informacji na temat parametrów, zobacz IDispEventImpl.
Poniższy kod deklaruje dwa ujścia punktu połączenia dla interfejsu DCalendarEvents
dla obiektu COM zaimplementowanego przez klasę CMyCompositCtrl2
:
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
Deklarowanie mapy ujścia zdarzeń
Aby powiadomienia o zdarzeniach, które mają być obsługiwane przez odpowiednią funkcję, klasa musi kierować każde zdarzenie do poprawnej procedury obsługi. Można to osiągnąć, deklarując mapę ujścia zdarzeń.
AtL udostępnia kilka makr, BEGIN_SINK_MAP, END_SINK_MAP i SINK_ENTRY_EX, które ułatwiają to mapowanie. Standardowy format jest następujący:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
Poniższy przykład deklaruje mapę ujścia zdarzeń z dwoma procedurami obsługi zdarzeń:
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()
Implementacja jest prawie zakończona. Ostatnim krokiem jest doradztwo i nienadzorowanie interfejsów zewnętrznych.
Doradztwo i unadvising interfejsów IDispEventImpl
Ostatnim krokiem jest zaimplementowanie metody, która będzie doradzać (lub nienadzorować) wszystkim punktom połączenia w odpowiednim czasie. Należy to zrobić przed rozpoczęciem komunikacji między klientami zewnętrznymi a obiektem. Zanim obiekt stanie się widoczny, każdy zewnętrzny interfejs wysyłania obsługiwany przez obiekt jest odpytywany dla interfejsów wychodzących. Nawiązane jest połączenie, a odwołanie do interfejsu wychodzącego jest używane do obsługi zdarzeń z obiektu. Ta procedura jest określana jako "doradztwo".
Po zakończeniu pracy obiektu z interfejsami zewnętrznymi interfejsy wychodzące powinny być powiadamiane o tym, że nie są już używane przez klasę. Ten proces jest nazywany "nienadzorowaniem".
Ze względu na unikatowy charakter obiektów COM ta procedura różni się szczegółowo i wykonuje między implementacjami. Te szczegóły wykraczają poza zakres tego tematu i nie zostały rozwiązane.