Princípios de manipulação de eventos
Há três etapas comuns a toda manipulação de eventos. Você precisará:
Implementar a interface do evento em seu objeto.
Informar a origem do evento de que seu objeto deseja receber eventos.
Desinformar a origem do evento de que seu objeto não precisa mais receber eventos.
A maneira como você implementará a interface do evento dependerá de seu tipo. Uma interface de evento pode ser vtable, dual ou dispinterface. Cabe ao designer da origem do evento definir a interface; cabe a você implementar essa interface.
Observação
Embora não haja motivos técnicos para que uma interface de evento não possa ser dupla, há uma série de bons motivos de design para evitar o uso de duals. No entanto, essa é uma decisão tomada pelo designer/implementador da origem do evento. Como está trabalhando na perspectiva do evento sink
, você precisa permitir a possibilidade de que talvez não tenha escolha a não ser implementar uma interface de evento dual. Para obter mais informações sobre interfaces dual, consulte Interfaces Dual e ATL.
O aconselhamento da origem do evento pode ser dividido em três etapas:
Consulte o objeto fonte para IConnectionPointContainer.
Chame IConnectionPointContainer::FindConnectionPoint passando o IID da interface de evento que interessa. Se tiver êxito, isso retornará a interface IConnectionPoint em um objeto de ponto de conexão.
Chame IConnectionPoint::Advise passando o
IUnknown
do coletor de eventos. Se tiver êxito, isso retornará um cookieDWORD
que representa a conexão.
Depois de registrar com êxito seu interesse em receber eventos, os métodos na interface de evento do objeto serão chamados de acordo com os eventos disparados pelo objeto fonte. Quando você não precisar mais receber eventos, poderá passar o cookie de volta para o ponto de conexão por meio de IConnectionPoint::Unadvise. Isso interromperá a conexão entre a fonte e o coletor.
Tenha cuidado para evitar ciclos de referência ao manipular eventos.