Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Deklariert ein Ereignis.
Hinweis
Ereignisattribute in systemeigenem C++ sind mit Standard C++ nicht kompatibel. Sie werden nicht kompiliert, wenn Sie den Konformitätsmodus angeben /permissive- .
Syntax
__eventmember-function-declarator;
__event__interfaceinterface-specifier;
__eventdata-member-declarator;
Bemerkungen
Das microsoftspezifische Schlüsselwort __event kann auf eine Memberfunktionsdeklaration, eine Schnittstellendeklaration oder eine Datenmemerdeklaration angewendet werden. Sie können das __event Schlüsselwort jedoch nicht verwenden, um ein Mitglied einer geschachtelten Klasse zu qualifizieren.
Je nachdem, ob die Ereignisquelle und der Empfänger systemeigene C++-, COM- oder verwaltete (.NET Framework) sind, können Sie die folgenden Konstrukte als Ereignisse verwenden:
| Systemeigenes C++ | COM | Verwaltet (.NET Framework) |
|---|---|---|
| Mitgliedsfunktion | - | Methode |
| - | Schnittstelle | - |
| - | - | Data Member |
Wird __hook in einem Ereignisempfänger verwendet, 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 vorlagenbasierte Klasse oder Struktur kann keine Ereignisse enthalten.
Systemeigene Ereignisse
Systemeigene Ereignisse sind Memberfunktionen. Der Rückgabetyp ist in der Regel HRESULT oder void, kann jedoch ein beliebiger integraler Typ sein, einschließlich eines 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 finden Sie unter "Ereignisbehandlung in nativem C++ ".
COM-Ereignisse
COM-Ereignisse sind Schnittstellen. Die Parameter einer Memberfunktion in einer Ereignisquellschnittstelle sollten parameter sein, aber sie wird nicht streng erzwungen. Der Grund dafür ist, dass ein Ausgabeparameter beim Multicasting nicht hilfreich ist. Wenn Sie einen Ausgabeparameter verwenden, wird eine Warnung der Ebene 1 ausgegeben.
Der Rückgabetyp ist in der Regel HRESULT oder void, kann jedoch ein beliebiger integraler 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 für eine COM-Ereignisquelle immer erforderlich __event .
// Example of a COM event:
__event __interface IEvent1;
Siehe Ereignisbehandlung in COM für Beispielcode.
Verwaltete Ereignisse
Informationen zum Codieren von Ereignissen in der neuen Syntax finden Sie unter "Event".
Verwaltete Ereignisse sind Datenmember oder Memberfunktionen. Bei Verwendung mit einem Ereignis muss der Rückgabetyp eines Delegaten der Common Language Specification entsprechen. Der Rückgabetyp des Ereignishandlers muss mit dem Rückgabetyp des Delegaten übereinstimmen. Weitere Informationen zu Stellvertretungen finden Sie unter Delegaten und Ereignisse. Wenn es sich bei einem verwalteten Ereignis um ein Datenelement handelt, muss der Typ ein Zeiger auf einen Delegaten sein.
Im .NET Framework können Sie ein Datenmememm so behandeln, als wäre es eine Methode selbst (d. h. die Invoke Methode des entsprechenden Delegaten). Dazu müssen Sie den Delegattyp zum Deklarieren eines Mitglieds für verwaltete Ereignisdaten definieren. Im Gegensatz dazu definiert eine Methode für verwaltete Ereignisse implizit den entsprechenden verwalteten Delegaten, wenn er noch nicht definiert ist. Sie können z. B. einen Ereigniswert wie OnClick z. B. ein Ereignis wie folgt deklarieren:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
Beim impliziten Deklarieren eines verwalteten Ereignisses können Sie Angeben und remove Accessoren angebenadd, die aufgerufen werden, wenn Ereignishandler hinzugefügt oder entfernt werden. Sie können auch die Memberfunktion definieren, die das Ereignis von 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;
}
};
Siehe auch
Schlüsselwörter
Ereignisbehandlung
event_source
event_receiver
__hook
__unhook
__raise