Condividi tramite


Supporto di IDispEventImpl

La classe modello IDispEventImpl può essere usata per fornire supporto per i sink dei punti di connessione nella classe ATL. Un sink del punto di connessione consente alla classe di gestire gli eventi generati da oggetti COM esterni. Questi sink dei punti di connessione vengono mappati a una mappa sink eventi, fornita dalla classe .

Per implementare correttamente un sink del punto di connessione per la classe, è necessario completare i passaggi seguenti:

  • Importare le librerie dei tipi per ogni oggetto esterno

  • Dichiarare le IDispEventImpl interfacce

  • Dichiarare una mappa sink di eventi

  • Consigliare e annullare la visualizzazione dei punti di connessione

I passaggi necessari per implementare un sink del punto di connessione vengono eseguiti modificando solo il file di intestazione (h) della classe.

Importazione delle librerie dei tipi

Per ogni oggetto esterno di cui si desidera gestire gli eventi, è necessario importare la libreria dei tipi. Questo passaggio definisce gli eventi che possono essere gestiti e fornisce informazioni che vengono usate durante la dichiarazione della mappa del sink di eventi. A tale scopo, è possibile usare la direttiva #import . Aggiungere le righe di direttiva necessarie #import per ogni interfaccia dispatch che verrà supportata nel file di intestazione (.h) della classe.

Nell'esempio seguente viene importata la libreria dei tipi di un server COM esterno (MSCAL.Calendar.7):

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

Nota

È necessario disporre di un'istruzione separata #import per ogni libreria dei tipi esterna supportata.

Dichiarazione delle interfacce IDispEventImpl

Ora che sono state importate le librerie dei tipi di ogni interfaccia dispatch, è necessario dichiarare interfacce separate IDispEventImpl per ogni interfaccia dispatch esterna. Modificare la dichiarazione della classe aggiungendo una IDispEventImpl dichiarazione di interfaccia per ogni oggetto esterno. Per altre informazioni sui parametri, vedere IDispEventImpl.

Il codice seguente dichiara due sink del punto di connessione, per l'interfaccia , per l'oggetto DCalendarEvents COM implementato dalla classe CMyCompositCtrl2:

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

Dichiarazione di una mappa sink di eventi

Affinché le notifiche degli eventi vengano gestite dalla funzione corretta, la classe deve instradare ogni evento al gestore corretto. Questa operazione viene ottenuta dichiarando una mappa del sink di eventi.

ATL offre diverse macro, BEGIN_SINK_MAP, END_SINK_MAP e SINK_ENTRY_EX, che semplificano questo mapping. Il formato standard è il seguente:

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

L'esempio seguente dichiara una mappa sink di eventi con due gestori eventi:

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

L'implementazione è quasi completa. L'ultimo passaggio riguarda la consulenza e la visualizzazione di avvisi delle interfacce esterne.

Consulenza e visualizzazione delle interfacce IDispEventImpl

Il passaggio finale consiste nell'implementare un metodo che consiglia (o non avvisa) tutti i punti di connessione nei momenti appropriati. Questa consulenza deve essere eseguita prima della comunicazione tra i client esterni e l'oggetto può avvenire. Prima che l'oggetto diventi visibile, viene eseguita una query su ogni interfaccia dispatch esterna supportata dall'oggetto per le interfacce in uscita. Viene stabilita una connessione e viene usato un riferimento all'interfaccia in uscita per gestire gli eventi dall'oggetto . Questa procedura viene definita "consulenza".

Al termine dell'oggetto con le interfacce esterne, le interfacce in uscita devono ricevere una notifica che non vengono più usate dalla classe. Questo processo viene definito "unadvising".

A causa della natura univoca degli oggetti COM, questa procedura varia, in dettaglio ed esecuzione, tra le implementazioni. Questi dettagli non rientrano nell'ambito di questo argomento e non vengono trattati.

Vedi anche

Nozioni fondamentali sugli oggetti COM ATL