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=typenative. 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

Behandlung von Ereignissen