__event
Schlüsselwort
Deklariert ein Ereignis.
Hinweis
Ereignisattribute in systemeigenem C++ sind mit Standard C++ nicht kompatibel. Sie werden nicht kompiliert, wenn Sie den /permissive-
Konformitätsmodus angeben.
Syntax
__event
member-function-declarator
;
__event
__interface
interface-specifier
;
__event
data-member-declarator
;
Hinweise
Das microsoftspezifische Schlüsselwort __event
kann auf eine Memberfunktionsdeklaration, eine Schnittstellendeklaration oder eine Datenmemerdeklaration angewendet werden. Sie können jedoch das __event
-Schlüsselwort nicht verwenden, um einen Member einer geschachtelten Klasse zu qualifizieren.
Je nachdem, ob Ereignisquelle und Empfänger systemeigenes C++, COM oder verwaltet (.NET Framework) sind, können Sie die folgenden Konstrukte als Ereignisse verwenden:
Systemeigenes C++ | COM | Verwaltet (.NET Framework) |
---|---|---|
Memberfunktion | - | Methode |
- | Schnittstelle | - |
- | - | Datenelement |
__hook
in einem Ereignisempfänger verwenden, um eine Handlerelementfunktion einer Ereigniselementfunktion zuzuordnen. Nachdem Sie ein Ereignis mit dem __event
Schlüsselwort erstellt haben, werden alle Ereignishandler, die mit diesem Ereignis eingebunden sind, anschließend aufgerufen, wenn das Ereignis aufgerufen wird.
Eine __event
Memberfunktionsdeklaration kann keine Definition aufweisen. Eine Definition wird implizit generiert, sodass die Ereignismemmfunktion aufgerufen werden kann, als wäre es eine normale Memberfunktion.
Hinweis
Eine von einer Vorlage gebildete Klasse oder Struktur kann keine Ereignisse enthalten.
Systemeigene Ereignisse
Systemeigene Ereignisse sind Memberfunktionen. Der Rückgabetyp ist normalerweise HRESULT
oder void
, kann jedoch ein beliebiger ganzzahliger Typ sein, einschließlich enum
. Wenn ein Ereignis einen integralen Rückgabetyp verwendet, wird eine Fehlerbedingung definiert, wenn ein Ereignishandler einen Wert ungleich Null zurückgibt. In diesem Fall ruft das ausgelöste Ereignis die anderen Stellvertretungen auf.
// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);
Beispielcode erhalten Sie unter Event Handling in Native C++.
COM-Ereignisse
COM-Ereignisse sind Schnittstellen. Die Parameter einer Memberfunktion in einer Ereignisquellschnittstelle sollten Eingabe-Parameter sein, aber sie wird nicht streng erzwungen. Der Grund dafür ist, dass ein Ausgabe-Parameter beim Multicasting nicht hilfreich ist. Ein Warnung der Stufe 1 wird ausgegeben, wenn Sie einen Ausgabe-Parameter verwenden.
Der Rückgabetyp ist normalerweise HRESULT
oder void
, kann jedoch ein beliebiger ganzzahliger Typ sein, einschließlich enum
. Wenn ein Ereignis einen integralen Rückgabetyp verwendet und ein Ereignishandler einen Wert ungleich Null zurückgibt, handelt es sich um eine Fehlerbedingung. Das ausgelöste Ereignis bricht die Aufrufe der anderen Stellvertretungen ab. Der Compiler kennzeichnet automatisch eine Ereignisquellschnittstelle als source
in der generierten IDL.
Das __interface
-Schlüsselwort ist immer nach __event
für eine COM-Ereignisquelle erforderlich.
// Example of a COM event:
__event __interface IEvent1;
Beispielcode erhalten Sie unter Event Handling in COM.
Verwaltete Ereignisse
Weitere Informationen über die Codierung von Ereignissen in der neuen Syntax finden Sie unter Ereignis.
Verwaltete Ereignisse sind Datenmember oder Memberfunktionen. Bei Verwendung mit einem Ereignis muss der Rückgabetyp eines Delegaten der Common Language Specification (CLS) entsprechen. Der Rückgabetyp des Ereignishandlers muss dem Rückgabetyp des Delegaten entsprechen. Weitere Informationen über Delegate finden Sie unter Delegaten und Ereignisse. Wenn ein verwaltetes Ereignis ein Datenmember ist, muss ihr Typ ein Zeiger auf einen Delegaten sein.
In .NET Framework können Sie einen Datenmember behandeln, als wäre er eine Methode selbst (d. h. die Invoke
-Methode des entsprechenden Delegaten). Um dies zu tun, müssen Sie den Delegattyp vordefinieren, um einen verwalteten Ereignisdatenmember zu deklarieren. Im Gegensatz dazu definiert eine verwaltete Ereignismethode implizit den entsprechenden verwalteten Delegaten, sofern er noch nicht definiert ist. Sie können beispielsweise einen Ereigniswert wie OnClick
als Ereignis wie folgt angeben:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
Wenn Sie implizit ein verwaltetes Ereignis deklarieren, können Sie add
- und remove
-Zugriffsmethoden angeben, die aufgerufen werden, wenn Ereignishandler hinzugefügt oder entfernt werden. Sie können auch die Mitgliedsfunktion definieren, die das Ereignis außerhalb der Klasse aufruft (auslöst).
Beispiel: Systemeigene Ereignisse
// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
Beispiel: COM-Ereignisse
// 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;
}
};
Weitere Informationen
Schlüsselwörter
Behandlung von Ereignissen
event_source
event_receiver
__hook
__unhook
__raise