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
interfacceDichiarare 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.