Palabra clave __event

Declara un evento.

Nota:

Los atributos de eventos en C++ nativo no son compatibles con C++ estándar. No se compilan al especificar el modo de conformidad /permissive-.

Sintaxis

__event member-function-declarator ;
__event __interface interface-specifier ;
__event data-member-declarator ;

Comentarios

La palabra clave específica de Microsoft __event se puede aplicar a una declaración de función miembro, una declaración de interfaz o una declaración de miembro de datos. Sin embargo, no se puede usar la palabra clave __event para calificar a un miembro de una clase anidada.

Dependiendo de si el origen y el receptor del evento son C++ nativo, COM o administrados (.NET Framework), puede usar las siguientes construcciones como eventos:

C++ nativo COM Administrada (.NET Framework)
función miembro - método
- interfaz -
- - miembro de datos

Use __hook en un receptor de eventos para asociar una función miembro de controlador a una función miembro de evento. Después de crear un evento con la palabra clave __event, se llama a todos los controladores de eventos asociados a ese evento después cuando se llama al evento.

Una función miembro __event no puede tener una definición; Una definición se genera implícitamente, por lo que se puede llamar a la función miembro de evento como si fuera una función miembro normal.

Nota:

Una clase o estructura con plantilla no puede contener eventos.

Eventos nativos

Los eventos nativos son funciones miembro. El tipo de valor devuelto es normalmente HRESULT o void, pero puede ser cualquier tipo entero, incluido enum. Cuando un evento usa un tipo de valor devuelto entero, se define una condición de error cuando un controlador de eventos devuelve un valor distinto de cero. En este caso, el evento que se genera llama a los demás delegados.

// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);

Vea Control de eventos en C++ nativo para ver ejemplos de código.

Eventos COM

Los eventos COM son interfaces. Los parámetros de una función miembro en una interfaz de origen de eventos deben estar en los parámetros, pero no se aplican rigurosamente. Es porque un parámetro de salida no es útil cuando se realiza la multidifusión. Si usa un parámetro de salida se emitirá una advertencia de nivel 1.

El tipo de valor devuelto es normalmente HRESULT o void, pero puede ser cualquier tipo entero, incluido enum. Cuando un evento usa un tipo de valor devuelto entero y un controlador de eventos devuelve un valor distinto de cero, es una condición de error. El evento que se está generando anula las llamadas a los demás delegados. El compilador marca automáticamente una interfaz de origen de eventos como un source en el IDL generado.

La palabra clave __interface siempre se requiere después de __event para un origen de eventos COM.

// Example of a COM event:
__event __interface IEvent1;

Consulte el Control de eventos en COM para obtener un código de muestra.

Eventos administrados

Para obtener información sobre la codificación de eventos en la nueva sintaxis, consulte el evento.

Los eventos administrados son miembros de datos o funciones miembro. Cuando se usa con un evento, el tipo de retorno de un delegado debe cumplir con Common Language Specification. El tipo de valor devuelto del controlador de eventos debe coincidir con el del delegado. Para obtener más información sobre los delegados, consulte Delegados y eventos. Si un evento administrado es un miembro de datos, el tipo debe ser un puntero a un delegado.

En .NET Framework, puede tratar un miembro de datos como si se tratara de un método en sí mismo (es decir, el método Invoke de su delegado correspondiente). Para hacerlo, predefina el tipo de delegado para declarar un miembro de datos de eventos administrados. Por el contrario, un método de evento administrado define implícitamente el delegado administrado correspondiente si aún no está definido. Por ejemplo, puede declarar un valor de evento tal como OnClick como evento de la manera siguiente:

// Examples of managed events:
__event ClickEventHandler* OnClick;  // data member as event
__event void OnClick(String* s);  // method as event

Al declarar implícitamente un evento administrado, puede especificar add y remove a los que se llama cuando se agregan o quitan controladores de eventos. También puede definir la función miembro que llama (genera) el evento desde fuera de la clase.

Ejemplo: eventos nativos

// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

Ejemplo: eventos COM

// EventHandling_COM_Event.cpp
// compile with: /c
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>

[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];

[ dual, uuid("00000000-0000-0000-0000-000000000002") ]
__interface IEventSource {
   [id(1)] HRESULT MyEvent();
};
[ coclass, uuid("00000000-0000-0000-0000-000000000003"),  event_source(com) ]
class CSource : public IEventSource {
public:
   __event __interface IEventSource;
   HRESULT FireEvent() {
      __raise MyEvent();
      return S_OK;
   }
};

Consulte también

Palabras clave
Control de eventos
event_source
event_receiver
__hook
__unhook
__raise