Condividi tramite


__event Parola chiave

Dichiara un evento.

Nota

Gli attributi di evento in C++ nativi non sono compatibili con C++Standard. Non vengono compilati quando si specifica la /permissive- modalità di conformità.

Sintassi

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

Osservazioni:

La parola chiave __event specifica di Microsoft può essere applicata a una dichiarazione di funzione membro, a una dichiarazione di interfaccia o a una dichiarazione di membro dati. Tuttavia, non è possibile usare la __event parola chiave per qualificare un membro di una classe annidata.

A seconda che l'origine evento e il ricevitore siano C++ nativi, COM o gestiti (.NET Framework), è possibile utilizzare i seguenti costrutti come eventi:

C++ nativo COM Gestito (.NET Framework)
funzione membro - method
- interface -
- - membro dati

Utilizzare __hook in un ricevitore di eventi per associare una funzione membro del gestore a una funzione membro dell'evento. Dopo aver creato un evento con la __event parola chiave , tutti i gestori eventi associati a tale evento vengono successivamente chiamati quando viene chiamato l'evento.

Una __event dichiarazione di funzione membro non può avere una definizione. Una definizione viene generata in modo implicito, quindi la funzione membro dell'evento può essere chiamata come se fosse una normale funzione membro.

Nota

Una classe o uno struct basato su modelli non può contenere eventi.

Eventi nativi

Gli eventi nativi sono funzioni membro. Il tipo restituito è in HRESULT genere o void, ma può essere qualsiasi tipo integrale, incluso un oggetto enum. Quando un evento usa un tipo restituito integrale, viene definita una condizione di errore quando un gestore eventi restituisce un valore diverso da zero. In questo caso, l'evento generato chiama gli altri delegati.

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

Per il codice di esempio, vedere Gestione degli eventi in C++ nativo.

Eventi COM

Gli eventi COM sono interfacce. I parametri di una funzione membro in un'interfaccia dell'origine evento devono essere inclusi nei parametri, ma non vengono applicati rigorosamente. Perché un parametro out non è utile quando si esegue il multicast. Se si usa un parametro out, viene generato un avviso di livello 1.

Il tipo restituito è in HRESULT genere o void, ma può essere qualsiasi tipo integrale, incluso enum. Quando un evento usa un tipo restituito integrale e un gestore eventi restituisce un valore diverso da zero, si tratta di una condizione di errore. L'evento generato interrompe le chiamate agli altri delegati. Il compilatore contrassegna automaticamente un'interfaccia dell'origine evento come nell'IDL source generato.

La __interface parola chiave è sempre necessaria dopo __event per un'origine evento COM.

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

Per il codice di esempio, vedere Gestione degli eventi in COM .

Eventi gestiti

Per informazioni sulla codifica degli eventi nella nuova sintassi, vedere evento.

Gli eventi gestiti sono membri dati o funzioni membro. Se usato con un evento, il tipo restituito di un delegato deve essere conforme alla specifica common language. Il tipo restituito del gestore eventi deve corrispondere al tipo restituito del delegato. Per altre informazioni sui delegati, vedere Delegati ed eventi. Se un evento gestito è un membro dati, il relativo tipo deve essere un puntatore a un delegato.

In .NET Framework, è possibile trattare un membro dati come se fosse un metodo (ovvero, il metodo Invoke del delegato corrispondente). A tale scopo, predefinito il tipo delegato per dichiarare un membro dati dell'evento gestito. Al contrario, un metodo di evento gestito definisce in modo implicito il delegato gestito corrispondente, se non è già definito. Ad esempio, è possibile dichiarare un valore dell'evento quale OnClick come evento seguente:

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

Quando si dichiara in modo implicito un evento gestito, è possibile specificare add e remove le funzioni di accesso che vengono chiamate quando i gestori eventi vengono aggiunti o rimossi. È anche possibile definire la funzione membro che chiama (genera) l'evento dall'esterno della classe .

Esempio: Eventi nativi

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

Esempio: eventi 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;
   }
};

Vedi anche

Parole chiave
Gestione degli eventi
event_source
event_receiver
__hook
__unhook
__raise