Udostępnij za pośrednictwem


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ów

  • Deklarowanie 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.

Zobacz też

Podstawowe informacje na temat obiektów COM ATL