Supporto IDispEventImpl

La classe template IDispEventImpl consente di fornire il supporto per i punti di connessione nell'oggetto COM ATL. Un punto di connessione consente all'oggetto COM gestire gli eventi generati da oggetti COM esterni. Questi punti di connessione vengono mappati con una mappa del sink di evento, fornita dal vostro oggetto COM.

Per implementare correttamente un punto di connessione o punti per l'oggetto COM, è necessario completare i seguenti passaggi:

In questa procedura verrà modificato solo il file di intestazione (. h) della vostra classe COM.

Importazione di librerie dei tipi

Per ogni oggetto esterno cui eventi che si vogliono gestire, è necessario importare la libreria dei tipi. Questo passaggio definisce gli eventi che possono essere gestiti e fornisce informazioni che viene utilizzate quando si dichiara la mappa del sink di evento. La direttiva # import può essere utilizzata per eseguire questa operazione. Aggiungere le righe la direttiva necessarie # import per ogni interfaccia dispatch che sosterrà il file di intestazione (. h) della vostra classe COM.

Nell'esempio seguente l'importazione della libreria dei tipi di un server COM esterno ( MyServer ):

 # import "D:\MyServer.dll" raw_interfaces_only, no_namespace, named_guids

&Notanbsp;  È necessario disporre di un'istruzione separata # import per ogni interfaccia di invio esterno che sosterrà.

Dichiarando le interfacce IDispEventImpl

Ora che aver importato le librerie dei tipi di ogni interfaccia dispatch, è necessario dichiarare le interfacce di IDispEventImpl separate per ogni interfaccia dispatch esterni. Modificare la dichiarazione della classe COM con l'aggiunta di una dichiarazione di interfaccia IDispEventImpl per ogni oggetto esterno. Per ulteriori informazioni sui parametri, vedere IDispEventImpl.

Le seguenti righe di codice dichiarano due punti di connessione, per il costume IExtEvents1 e IExtEvents2 interfacce per l'oggetto COM implementata dalla classeCMyObj:

pubblica IDispEventImpllt; 0, CMyObj e DIID__IExtEvents1,
    & LIBID_EXTEVENTS1Lib, 1, 0 >,
IDispEventImpl pubblica < 1, CMyObj e DIID__IExtEvents2,
    & LIBID_EXTEVENTS2Lib, 1, 0 & gt

Dichiarando una mappa del Sink di evento

Affinché le notifiche di evento essere gestita dalla funzione appropriata, l'oggetto COM deve indirizzare ogni evento al relativo gestore corretto. Questo risultato è ottenuto dichiarando una mappa del sink di evento.

ATL fornisce diverse macro, BEGIN_SINK_MAP, END_SINK_MAPe SINK_ENTRY, che rendono più facile questo mapping. Il formato standard è la seguente:

BEGI&N_SINK_MAP(ComClass)
 nbsp; SINK_ENTRY (id, dispid, func)
... le voci di evento esterno //additional
END_SINK_MAP()

Nell'esempio seguente viene dichiarata una mappa del sink di evento con due gestori di eventi:

BEGIN_SINK_MAP(CMyObj)
   SINK_ENTRY (0, Events1, OnClick1)
   SINK_ENTRY (0, Events2, OnClick2)
END_SINK_MAP()

L'implementazione è quasi completo. L'ultimo passaggio riguarda la consulenza e annullare le interfacce esterne.

Consulenza e annullare le interfacce IDispEventImpl

Il passo finale è quello di implementare un metodo che sarà consigliare (o unadvise) tutti i punti di connessione del momento adeguato. Questa consulenza deve essere fatta prima che può avvenire la comunicazione tra il client esterni e l'oggetto. Prima che l'oggetto diventa visibile, ogni interfaccia di invio esterno supportato dal vostro oggetto viene eseguita una query per le interfacce in uscita. Viene stabilita una connessione e un riferimento all'interfaccia in uscita viene utilizzato per gestire gli eventi dal controllo. Questa procedura è indicata come "consulenza".

Dopo che l'oggetto è finito con le interfacce esterne, le interfacce in uscita devono essere notificate non più utilizzate dall'oggetto COM. Questo processo è indicato come "annullare".

A causa della natura unica di oggetti COM, questa procedura varia, in dettaglio e l'esecuzione, tra le implementazioni. Questi dettagli sono oltre la portata di questo argomento e non vengono affrontati.

Index