Condividi tramite


IDispEventImpl di supporto

La classe modello IDispEventImpl può essere utilizzata per fornire il supporto per i sink di punti di connessione nella classe ATL.Un sink di punti di connessione modo la classe per gestire gli eventi generati da oggetti COM esterni.Questi sink di punti di connessione sono mappati a una mappa del sink di eventi, indipendentemente dalla classe.

Per distribuire correttamente un sink del punto di connessione per la classe, i passaggi seguenti devono essere completate:

  • Importare le librerie dei tipi per ogni oggetto esterno

  • Dichiarare le interfacce IDispEventImpl

  • Dichiarare una mappa del sink di eventi

  • Consigli e unadvise i punti di connessione

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

Importare le librerie dei tipi

Per ogni oggetto esterno dell'evento che si desidera gestire, è necessario importare la libreria dei tipi.Questo passaggio consente di definire gli eventi che possono essere gestiti e fornisce le informazioni utilizzate quando si dichiara la mappa del sink di eventi.La direttiva #import può essere utilizzata per tale scopo.Aggiungere le righe direttive necessarie #import per ogni interfaccia dispatch che supporterete al file di intestazione (h) della classe.

Nell'esempio seguente viene importata la libreria dei tipi del server COM esterni (MSCAL.Calendar.7):

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

[!NOTA]

È necessario avere un'istruzione distinta #import per ciascuna libreria dei tipi che esterna supporterete.

Dichiarazione delle interfacce di IDispEventImpl

Dopo avere importato le librerie dei tipi di ogni interfaccia dispatch, è necessario dichiarare le interfacce distinte IDispEventImpl per ogni interfaccia dispatch esterna.Modificare la dichiarazione della classe aggiungendo una dichiarazione di interfaccia IDispEventImpl per ogni oggetto esterno.Per ulteriori informazioni sui parametri, vedere IDispEventImpl.

Il seguente codice dichiara due sink di punti di connessione, per l'interfaccia DCalendarEvents, sull'oggetto 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 mappa del sink di eventi

Affinché le notifiche di eventi da gestire la funzione appropriata, la classe deve soddisfare ogni evento al gestore corretto.Questo risultato si ottiene dichiarando una mappa del sink di eventi.

ATL fornisce diverse macro, BEGIN_SINK_MAP, END_SINK_MAPe SINK_ENTRY_EX, rendendo questo mapping più semplice.Il formato standard è la seguente:

BEGIN_SINK_MAP(comClass)

SINK_ENTRY_EX(id, iid, dispid, func)

. . . //additional external event entries

END_SINK_MAP()

Nell'esempio seguente viene dichiarata una mappa del 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 su e consigliare unadvising delle interfacce esterne.

Consigliare e Unadvising le interfacce di IDispEventImpl

Il passaggio finale consiste di implementare un metodo che consiglierà (o) unadvise tutti i punti di connessione in momenti appropriati.Si consiglia che deve essere eseguita prima di comunicazione tra client esterni e l'oggetto può aver luogo.Prima dell'oggetto diventa visibile, ogni interfaccia dispatch esterna supportate dall'oggetto viene eseguita una query per le interfacce in uscita.Una connessione viene stabilita e un riferimento all'interfaccia in uscita viene utilizzato per gestire gli eventi generati dall'oggetto.Questa procedura è denominato "ha".

Dopo che l'oggetto viene completato con le interfacce esterne, le interfacce in uscita devono essere passate che non sono più utilizzati dalla classe.Questo processo viene denominato "unadvising".

A causa della natura univoca di oggetti COM, questa procedura varia, e in esecuzione, tra implementazioni.Questi dettagli nell'ambito di questo argomento e non vengono risolti.

Vedere anche

Riferimenti

Principi fondamentali di oggetti COM ATL