Sdílet prostřednictvím


Podpora IDispEventImpl

Třídu šablony IDispEventImpl lze použít k zajištění podpory pro jímky spojovacích bodů ve vaší třídě ATL. Jímka spojovacího bodu umožňuje vaší třídě zpracovávat události aktivované z externích objektů COM. Tyto jímky spojovacího bodu se mapují pomocí mapy jímky událostí, kterou poskytuje vaše třída.

Chcete-li správně implementovat jímku spojovacího bodu pro vaši třídu, je nutné dokončit následující kroky:

  • Import knihoven typů pro každý externí objekt

  • IDispEventImpl Deklarace rozhraní

  • Deklarace mapy jímky událostí

  • Radíte a nepřipozorujte spojovací body.

Kroky, které se týkají implementace jímky spojovacího bodu, se provádějí úpravou pouze souboru hlavičky (.h) vaší třídy.

Import knihoven typů

Pro každý externí objekt, jehož události chcete zpracovat, je nutné importovat knihovnu typů. Tento krok definuje události, které lze zpracovat, a poskytuje informace, které se používají při deklarování mapy jímky událostí. K tomuto účelu lze použít direktivu #import . Přidejte potřebné #import řádky direktivy pro každé rozhraní dispečera, které budete podporovat do hlavičkového souboru (.h) třídy.

Následující příklad naimportuje knihovnu typů externího serveru COM (MSCAL.Calendar.7):

#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only

Poznámka:

Pro každou externí knihovnu typů, kterou budete podporovat, musíte mít samostatný #import příkaz.

Deklarace rozhraní IDispEventImpl

Teď, když jste naimportovali knihovny typů jednotlivých rozhraní dispečerské služby, musíte deklarovat samostatná IDispEventImpl rozhraní pro každé externí rozhraní pro odesílání. Upravte deklaraci třídy přidáním IDispEventImpl deklarace rozhraní pro každý externí objekt. Další informace o parametrech naleznete v tématu IDispEventImpl.

Následující kód deklaruje dvě jímky spojovacího bodu pro DCalendarEvents rozhraní pro objekt COM implementovaný třídou CMyCompositCtrl2:

public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>

Deklarace mapy jímky událostí

Aby byla oznámení událostí zpracována správnou funkcí, musí vaše třída směrovat každou událost do správné obslužné rutiny. Toho dosáhnete deklarováním mapy jímky událostí.

ATL poskytuje několik maker, BEGIN_SINK_MAP, END_SINK_MAP a SINK_ENTRY_EX, které usnadňují toto mapování. Standardní formát je následující:

BEGIN_SINK_MAP(comClass)
  SINK_ENTRY_EX(id, iid, dispid, func)
  . . . //additional external event entries
END_SINK_MAP()

Následující příklad deklaruje mapu jímky událostí se dvěma obslužnými rutinami událostí:

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()

Implementace je téměř dokončena. Posledním krokem je poradenství a nedodržování externích rozhraní.

Poradenství a Unadvising rozhraní IDispEventImpl

Posledním krokem je implementace metody, která doporučí (nebo nesnadvise) všechny spojovací body ve správných časech. Tato doporučení musí být provedena před zahájením komunikace mezi externími klienty a objektem. Než se objekt zobrazí, bude každé externí rozhraní pro odesílání podporované objektem dotazováno na odchozí rozhraní. Vytvoří se připojení a odkaz na odchozí rozhraní se používá ke zpracování událostí z objektu. Tento postup se označuje jako "poradenství".

Po dokončení objektu s externími rozhraními by měla být odchozí rozhraní upozorněna, že už je vaše třída nepoužívá. Tento proces se označuje jako "nesnadvising".

Vzhledem k jedinečné povaze objektů MODELU COM se tento postup mezi implementacemi liší, podrobně a provádění. Tyto podrobnosti jsou nad rámec tohoto tématu a nejsou vyřešeny.

Viz také

Základy ATL – objekty COM