Admitir IDispEventImpl
La clase de plantilla IDispEventImpl se puede usar para proporcionar compatibilidad con los receptores de punto de conexión en la clase ATL. Un receptor de punto de conexión permite que la clase controle los eventos desencadenados desde objetos COM externos. Estos receptores de punto de conexión se asignan con un mapa de receptor de eventos, proporcionado por la clase.
A fin de implementar correctamente un receptor de punto de conexión para la clase, se deben completar los pasos siguientes:
Importar las bibliotecas de tipos para cada objeto externo
Declarar las interfaces
IDispEventImpl
Declarar un mapa de receptor de eventos
Aconsejar y desaconsejar los puntos de conexión
Los pasos necesarios para implementar un receptor de punto de conexión se realizan modificando solo el archivo de encabezado (.h) de la clase.
Importar las bibliotecas de tipos
Para cada objeto externo cuyos eventos desea controlar, debe importar la biblioteca de tipos. En este paso se definen los eventos que se pueden controlar y se proporciona información que se usa al declarar el mapa de receptor de eventos. La directiva #import se puede usar para lograrlo. Agregue las líneas de la directiva #import
necesarias para cada una de las interfaces de envío que admita al archivo de encabezado (.h) de la clase.
En el siguiente ejemplo se importa la biblioteca de tipos de un servidor COM externo (MSCAL.Calendar.7
):
#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only
Nota:
Debe tener una instrucción #import
independiente para cada biblioteca de tipos externa que admita.
Declarar las interfaces IDispEventImpl
Ahora que ha importado las bibliotecas de tipos de cada interfaz de envío, debe declarar interfaces IDispEventImpl
independientes para cada interfaz de envío externa. Modifique la declaración de la clase agregando una declaración de interfaz IDispEventImpl
para cada objeto externo. Para obtener más información sobre los parámetros, consulte IDispEventImpl.
El código siguiente declara dos receptores de punto de conexión, para la interfaz DCalendarEvents
, para el objeto COM implementado por la clase CMyCompositCtrl2
:
public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>
Declarar un mapa de receptor de eventos
Para que la función adecuada controle las notificaciones de eventos, la clase debe enrutar cada evento a su controlador correcto. Esto se logra mediante la declaración de un mapa de receptor de eventos.
ATL proporciona varias macros, BEGIN_SINK_MAP, END_SINK_MAP y SINK_ENTRY_EX, lo que facilita esta asignación. El formato estándar es el siguiente:
BEGIN_SINK_MAP(comClass)
SINK_ENTRY_EX(id, iid, dispid, func)
. . . //additional external event entries
END_SINK_MAP()
En el ejemplo siguiente se declara un mapa de receptor de eventos con dos controladores de eventos:
BEGIN_SINK_MAP(CMyCompositCtrl2)
//Make sure the Event Handlers have __stdcall calling convention
SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar1)
SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK,
&CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()
La implementación está casi completa. El último paso se refiere al hecho de aconsejar y desaconsejar las interfaces externas.
Aconsejar y desaconsejar las interfaces IDispEventImpl
El último paso consiste en implementar un método que aconsejará (o desaconsejará) todos los puntos de conexión en los momentos adecuados. Este asesoramiento debe realizarse antes de que pueda tener lugar la comunicación entre los clientes externos y su objeto. Antes de que el objeto se vuelva visible, se consulta cada interfaz de envío externa compatible con el objeto para las interfaces de salida. Se establece una conexión y se usa una referencia a la interfaz de salida para controlar los eventos del objeto. Este procedimiento se refiere al hecho de "aconsejar".
Una vez finalizado el objeto con las interfaces externas, se debe notificar a las interfaces de salida que la clase ya no las usa. Este proceso se refiere al hecho de "desaconsejar".
Debido a la naturaleza única de los objetos COM, este procedimiento varía, en detalle y ejecución, entre implementaciones. Estos detalles van más allá del ámbito de este tema y no se abordan.