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