Partilhar via


__event palavra-chave

Declara um evento.

Observação

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

Sintaxe

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

Observações

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

Dependendo se a origem e o recetor do evento são nativos C++, COM ou gerenciados (.NET Framework), você pode usar as seguintes construções como eventos:

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

Use __hook em um recetor de eventos para associar uma função de membro do manipulador a uma função de membro do evento. Depois de criar um evento com a palavra-chave __event , todos os manipuladores de eventos conectados a esse evento depois são chamados quando o evento é chamado.

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

Observação

Uma classe ou struct modelada não pode conter eventos.

Eventos nativos

Eventos nativos são funções de membro. O tipo de retorno é normalmente HRESULT ou void, mas pode ser qualquer tipo integral, incluindo um enumarquivo . Quando um evento usa um tipo de retorno integral, uma condição de erro é definida quando um manipulador de eventos retorna um valor diferente de zero. Neste caso, o evento que é levantado chama os outros delegados.

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

Consulte Tratamento de eventos em C++ nativo para obter 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 de evento devem estar em parâmetros, mas não são rigorosamente aplicados. É porque um parâmetro out não é útil ao multicasting. Um aviso de nível 1 é emitido se você usar um parâmetro out .

O tipo de retorno é tipicamente HRESULT ou void, mas pode ser qualquer tipo integral, incluindo enum. Quando um evento usa um tipo de retorno integral e um manipulador de eventos retorna um valor diferente de zero, é uma condição de erro. O evento que está sendo levantado aborta as chamadas para os outros delegados. O compilador marca automaticamente uma interface de origem de evento como um source no IDL gerado.

A __interface palavra-chave é sempre necessária depois __event para uma fonte de evento COM.

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

Consulte Tratamento de eventos em COM para obter o código de exemplo.

Eventos geridos

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

Os eventos gerenciados são membros de dados ou funções de membro. Quando usado com um evento, o tipo de retorno de um delegado deve estar em conformidade com a 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 deverá ser um ponteiro para um delegado.

No .NET Framework, você pode tratar um membro de dados como se fosse um método em si (ou seja, o Invoke método de seu representante correspondente). Para fazer isso, predefina o tipo de delegado para declarar um membro de dados de evento gerenciado. Por outro lado, um método de evento gerenciado define implicitamente o delegado gerenciado correspondente se ele ainda não estiver definido. Por exemplo, você pode declarar um valor de evento, como OnClick um evento, da seguinte maneira:

// 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, você pode especificar add e remove acessadores que são chamados quando manipuladores de eventos são adicionados ou removidos. Você também pode definir a função de 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;
   }
};

Ver também

Palavras-chave
Tratamento de eventos
event_source
event_receiver
__hook
__unhook
__raise