Principios de control de eventos
Hay tres pasos comunes para todo el control de eventos. Tendrá que:
Implementar la interfaz de eventos en el objeto.
Informar al origen del evento de que el objeto quiere recibir eventos.
Desviar el origen del evento cuando el objeto ya no necesite recibir eventos.
La forma en que implementará la interfaz de eventos dependerá de su tipo. Una interfaz de eventos puede ser vtable, dual o dispinterface. Definir la interfaz corresponde al diseñador del origen del evento; implementar dicha interfaz depende de usted.
Nota:
Aunque no hay motivos técnicos por los que una interfaz de eventos no puede ser dual, hay una serie de buenas razones de diseño para evitar el uso de duales. Pero esta es una decisión que toma el diseñador o implementador del origen del evento. Puesto que está trabajando desde la perspectiva del evento sink
, debe permitir la posibilidad de que no tenga otra opción que implementar una interfaz de evento dual. Para más información sobre las interfaces duales, consulte Interfaces duales y ATL.
Informar al origen del evento se puede dividir en tres pasos:
Consultar al objeto de origen para IConnectionPointContainer.
Llamar a IConnectionPointContainer::FindConnectionPoint pasando el IID de la interfaz de eventos que le interese. Si se ejecuta correctamente, devolverá la interfaz IConnectionPoint en un objeto de punto de conexión.
Llamar a IConnectionPoint::Advise pasando el valor
IUnknown
del receptor de eventos. Si se ejecuta correctamente, devolverá una cookieDWORD
que representa la conexión.
Una vez que haya registrado de forma correcta su interés en recibir eventos, se llamará a los métodos de la interfaz de eventos del objeto según los eventos desencadenados por el objeto de origen. Cuando ya no necesite recibir eventos, puede volver a pasar la cookie al punto de conexión a través de IConnectionPoint::Unadvise. Esto interrumpirá la conexión entre el origen y el receptor.
Tenga cuidado de evitar ciclos de referencia al controlar eventos.