Principi di gestione degli eventi
Esistono tre passaggi comuni a tutte le operazioni di gestione degli eventi. Sarà necessario eseguire queste operazioni:
Implementare l'interfaccia evento nell'oggetto.
Consigliare all'origine evento che l'oggetto desidera ricevere eventi.
Annullare la visualizzazione dell'origine evento quando l'oggetto non deve più ricevere eventi.
Il modo in cui si implementerà l'interfaccia evento dipenderà dal relativo tipo. Un'interfaccia evento può essere vtable, dual o dispinterface. Spetta alla finestra di progettazione dell'origine evento definire l'interfaccia; spetta all'utente implementare tale interfaccia.
Nota
Anche se non esistono motivi tecnici per cui un'interfaccia di evento non può essere doppia, esistono diversi motivi di progettazione validi per evitare l'uso di duali. Tuttavia, si tratta di una decisione presa dalla finestra di progettazione/implementazione dell'origine evento. Poiché si lavora dal punto di vista dell'evento sink
, è necessario consentire la possibilità che non si abbia scelta, ma di implementare un'interfaccia a doppio evento. Per altre informazioni sulle interfacce duali, vedere Interfacce duali e ATL.
La visualizzazione dell'origine evento può essere suddivisa in tre passaggi:
Eseguire una query sull'oggetto di origine per IConnectionPointContainer.
Chiama IConnectionPointContainer::FindConnectionPoint passando l'IID dell'interfaccia evento che ti interessa. In caso di esito positivo, verrà restituita l'interfaccia IConnectionPoint in un oggetto punto di connessione.
Chiamare IConnectionPoint::Advise passando l'oggetto del sink dell'evento
IUnknown
. In caso di esito positivo, verrà restituito unDWORD
cookie che rappresenta la connessione.
Dopo aver registrato correttamente l'interesse a ricevere eventi, i metodi sull'interfaccia evento dell'oggetto verranno chiamati in base agli eventi generati dall'oggetto di origine. Quando non è più necessario ricevere eventi, è possibile passare di nuovo il cookie al punto di connessione tramite IConnectionPoint::Unadvise. In questo modo verrà interrotta la connessione tra l'origine e il sink.
Prestare attenzione a evitare cicli di riferimento durante la gestione degli eventi.