Ereignisbehandlung in nativem C++-Code
In der systemeigenen C++-Ereignisbehandlung richten Sie eine Ereignisquelle und einen Ereignisempfänger mithilfe der Attribute event_source bzw. event_receiver ein, die angeben=type
native
. Diese Attribute ermöglichen es den Klassen, auf die sie angewendet werden, um Ereignisse zu auslösen und Ereignisse in einem systemeigenen, nicht-COM-Kontext zu behandeln.
Hinweis
Ereignisattribute in systemeigenem C++ sind mit Standard C++ nicht kompatibel. Sie werden nicht kompiliert, wenn Sie den Konformitätsmodus angeben /permissive-
.
Deklarieren von Ereignissen
Verwenden Sie in einer Ereignisquellklasse die __event
Schlüsselwort (keyword) für eine Methodendeklaration, um die Methode als Ereignis zu deklarieren. Stellen Sie sicher, dass Sie die Methode deklarieren, aber nicht definieren. Wenn Sie dies tun, wird ein Compilerfehler generiert, da der Compiler die Methode implizit definiert, wenn sie in ein Ereignis umgewandelt wird. Systemeigene Ereignisse können Methoden mit null oder mehr Parametern sein. Der Rückgabetyp kann ein integraler Typ sein void
.
Definieren von Ereignishandlern
In einer Ereignisempfängerklasse definieren Sie Ereignishandler. Ereignishandler sind Methoden mit Signaturen (Rückgabetypen, Aufrufen von Konventionen und Argumenten), die mit dem Ereignis übereinstimmen, das sie behandeln.
Binden von Ereignishandlern an Ereignisse
Außerdem verwenden Sie in einer Ereignisempfängerklasse die systeminterne Funktion __hook
, um Ereignisse mit Ereignishandlern zu verknüpfen und __unhook
die Zuordnung von Ereignissen von Ereignishandlern zu trennen. Sie können mehrere Ereignisse mit einem Ereignishandler oder mehrere Ereignishandler mit einem Ereignis verknüpfen.
Auslösen von Ereignissen
Rufen Sie zum Auslösen eines Ereignisses die als Ereignis deklarierte Methode in der Ereignisquellklasse auf. Wenn Handler an das Ereignis geknüpft wurden, werden die Handler aufgerufen.
Systemeigener C++-Ereigniscode
Das folgende Beispiel zeigt, wie ein Ereignis im systemeigenen C++-Code ausgelöst wird. Informationen zum Kompilieren und Ausführen des Beispiels finden Sie in den Kommentaren im Code. Um den Code in der Visual Studio-IDE zu erstellen, überprüfen Sie, ob die /permissive-
Option deaktiviert ist.
Beispiel
Code
// evh_native.cpp
// compile by using: cl /EHsc /W3 evh_native.cpp
#include <stdio.h>
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
[event_receiver(native)]
class CReceiver {
public:
void MyHandler1(int nValue) {
printf_s("MyHandler1 was called with value %d.\n", nValue);
}
void MyHandler2(int nValue) {
printf_s("MyHandler2 was called with value %d.\n", nValue);
}
void hookEvent(CSource* pSource) {
__hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
__hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
}
void unhookEvent(CSource* pSource) {
__unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
__unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
}
};
int main() {
CSource source;
CReceiver receiver;
receiver.hookEvent(&source);
__raise source.MyEvent(123);
receiver.unhookEvent(&source);
}
Output
MyHandler2 was called with value 123.
MyHandler1 was called with value 123.
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für