Compartilhar via


Palavra-chave __event

Declara um evento.

Observação

Os atributos de evento em C++ nativo são incompatíveis com o C++ Standard. Eles não são compilados quando você especifica o modo de conformidade /permissive-.

Sintaxe

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

Comentários

A palavra-chave __event específica da Microsoft pode ser aplicada a uma declaração de função membro, uma declaração de interface ou uma declaração de membro de dados. No entanto, não é possível usar a palavra-chave __event para qualificar um membro de uma classe aninhada.

Dependendo se sua fonte de evento e receptor são C++ Nativo, COM ou gerenciados (.NET Framework), você pode usar as seguintes construções como eventos:

C++ nativo COM Gerenciado (.NET Framework)
função de membro - method
- interface -
- - membro de dados

Use __hook em um receptor de eventos para associar uma função membro do manipulador a uma função de membro de evento. Após criar um evento com a palavra-chav __event, todos os manipuladores de eventos vinculados a esse evento serão chamados quando o evento for chamado.

Uma declaração de função membro __event não poderá ter uma definição, já que uma definição é gerada implicitamente, portanto, a função membro de evento pode ser chamada como se fosse qualquer função membro comum.

Observação

Uma classe ou estrutura de modelo não pode conter eventos.

Eventos nativos

Eventos nativos são funções membro. O tipo de retorno é normalmente HRESULT ou void, mas pode ser qualquer tipo integral, incluindo um enum. Quando um evento usar um tipo de retorno integral, uma condição de erro será definida quando um manipulador de eventos retornar um valor diferente de zero. Nesse caso, o evento gerado chama os outros delegados.

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

Confira Manipulação de eventos em C++ nativo para obter o código de exemplo.

Eventos COM

Os eventos COM são interfaces. Os parâmetros de uma função membro em uma interface de origem do evento devem ser parâmetros in, mas não impostos rigorosamente. Isso ocorre porque um parâmetro out não é útil durante multicasting. Um aviso de nível 1 será emitido se você usar um parâmetro out.

O tipo de retorno normalmente é HRESULT ou void, mas poderá ser qualquer tipo integral, incluindo enum. Quando um evento usar um tipo de retorno integral e um manipulador de eventos retornar um valor diferente de zero, será uma condição de erro. O evento sendo gerado anulará as chamadas para os outros delegados. O compilador marcará automaticamente uma interface de origem do evento como source no IDL gerado.

A palavra-chave __interface será sempre necessária após __event para uma origem do evento COM.

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

Confira Manipulação de eventos em COM para obter o código de exemplo.

Eventos gerenciadas

Para obter mais informações sobre os eventos de codificação na nova sintaxe, confira evento.

Os eventos gerenciados são membros de dados ou funções membro. Quando usado com um evento, o tipo de retorno de um delegado deverá estar em conformidade com o Common Language Specification. O tipo de retorno do manipulador de eventos deve corresponder ao tipo de retorno do delegado. Para obter mais informações sobre delegados, consulte Delegados e eventos. Se um evento gerenciado for um membro de dados, seu tipo deve ser um ponteiro para um delegado.

No .NET Framework, você pode tratar um membro de dados como um método (ou seja, o método Invoke do delegado correspondente). Para fazer isso, predefina o tipo de delegado para declarar um membro de dados do evento gerenciado. Por outro lado, um método de evento gerenciado definirá implicitamente o delegado gerenciado correspondente se ele ainda não estiver definido. Por exemplo, você pode declarar um valor do evento como OnClick como um evento a seguir:

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

Ao declarar implicitamente um evento gerenciado, será possível especificar os acessadores add e remove que serão chamados ao adicionar ou remover os manipuladores de eventos. Também é possível definir a função membro que chama (aumenta) o evento de fora da classe.

Exemplo: eventos nativos

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

Exemplo: 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;
   }
};

Confira também

Palavras-chave
Manipulação de eventos
event_source
event_receiver
__hook
__unhook
__raise