Compartir a través de


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.

Consulte también

Aspectos básicos de los objetos ATL COM