Principes de gestion des événements
Il existe trois étapes communes à toutes la gestion des événements.Vous aurez besoin :
Implémentez l'interface d'événements sur votre objet.
Informez la source d'événements que votre objet souhaite recevoir des événements.
Unadvise la source d'événements lorsque votre objet ne doit plus recevoir des événements.
La façon dont vous allez implémenter l'interface d'événement dépend de son type.Une interface d'événement peut être vtable, double, ou une dispinterface.Il appartient au concepteur de la source d'événements pour définir l'interface ; il vous appartient pour implémenter cette interface.
[!REMARQUE]
Bien qu'il n'y a aucune raison technique pour laquelle une interface d'événement ne peut pas être double, un certain nombre de bonnes raisons de conception pour éviter l'utilisation de conjugue.Toutefois, il s'agit d'une décision prise par le concepteur/implémenteur de la source d'événement.Étant donné que vous travaillez du point de vue de l'événement sink, vous devez tenir compte de la possibilité que vous ne pouvez avoir aucun tableau mais implémenter une interface double d'événements.Pour plus d'informations sur les interfaces doubles, consultez l' interfaces doubles et ATL.
Informer la source d'événements peut être divisé en trois étapes :
Interrogez l'objet source pour IConnectionPointContainer.
Appelez IConnectionPointContainer::FindConnectionPoint passant l'IID de l'interface d'événement qui vous intéresse.En cas de réussite, il retourne l'interface d' IConnectionPoint sur un objet de point de connexion.
Appelez IConnectionPoint::Advise passant IUnknown du récepteur d'événements.En cas de réussite, il retourne un cookie d' DWORD représentant la connexion.
Une fois que vous avez correctement inscrit votre intérêt en recevant des événements, des méthodes sur l'interface d'événement de l'objet sont appelées en fonction de les événements déclenchés par l'objet source.Lorsque vous n'avez plus besoin de recevoir des événements, vous pouvez passer le cookie au point de connexion via IConnectionPoint::Unadvise.Cela conduirait à rompre la connexion entre la source et le récepteur.
Veillez à éviter des cycles de référence en gérant des événements.