Resumen de control de eventos ATL
En general, el control de eventos COM es un proceso relativamente sencillo. Los pasos principales son tres:
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.
Implementación de la interfaz
Hay cuatro formas principales de implementar una interfaz mediante ATL.
Derivar de | Adecuado para el tipo de interfaz | Requiere que implemente todos los métodos* | Requiere una biblioteca de tipos en tiempo de ejecución |
---|---|---|---|
La interfaz | Tabla virtual | Sí | No |
IDispatchImpl | Dual | Sí | Sí |
IDispEventImpl | Interfaz dispinterface | No | Sí |
IDispEventSimpleImpl | Interfaz dispinterface | No | No |
* Al usar clases de soporte ATL, nunca es necesario implementar manualmente los métodos IUnknown
o IDispatch
.
Asesoramiento y retirada del aviso del origen del evento
Hay tres formas principales de asesorar y desavisar un origen del evento mediante ATL.
Función Advise | Función Unadvise | Más adecuado para su uso con | Requiere que realice seguimiento de una cookie | Comentarios |
---|---|---|---|---|
AtlAdvise, CComPtrBase::Advise | AtlUnadvise | Interfaces duales o de tabla virtual | Sí | AtlAdvise es una función ATL global. CComPtr y CComQIPtr usan CComPtrBase::Advise . |
IDispEventSimpleImpl::DispEventAdvise | IDispEventSimpleImpl::DispEventUnadvise | IDispEventImpl o IDispEventSimpleImpl | No | Menos parámetros que AtlAdvise dado que la clase base funciona más. |
CComCompositeControl::AdviseSinkMap(TRUE) | CComCompositeControl::AdviseSinkMap(FALSE) | Controles ActiveX en controles compuestos | No | CComCompositeControl::AdviseSinkMap notifica a todas las entradas del mapa del receptor de eventos. La misma función desavisó las entradas. La clase CComCompositeControl llama a este método de forma automática. |
CAxDialogImpl::AdviseSinkMap(TRUE) | CAxDialogImpl::AdviseSinkMap(FALSE) | Controles ActiveX en un cuadro de diálogo | No | CAxDialogImpl::AdviseSinkMap notifica y desavisa a todos los controles ActiveX del recurso de diálogo. Eso se realiza de forma automática. |