Sdílet prostřednictvím


Zpracování událostí v nativním kódu C++

Ve zpracování událostí modelu nativního jazyka C++ lze nastavit zdroj a příjemce události pomocí atributů event_source a event_receiver a zadáním parametru type=native.Tyto atributy umožňují třídám, na které jsou použity, vyvolat události a zpracovat události v nativním kontextu, který není COM.

Deklarace událostí

Ve třídě zdroje události je třeba pro deklaraci metody jako událost použít na metodu klíčové slovo __event.Je třeba se ujistit, že je provedena deklarace, nikoli však její definice. V opačném případě by byla vyvolána chyba kompilátoru, protože kompilátor definuje metodu implicitně po navázání na událost.Nativní události mohou být metody bez nebo s více argumenty.Návratový typ může být typ void nebo libovolný celočíselný typ.

Definice obslužných rutin událostí

V třídě příjemce události je třeba definovat obslužné rutiny událostí, což jsou metody s podpisy (návratové typy, konvence volání a argumenty) odpovídající události, kterou budou zpracovávat.

Připojení obslužných rutin událostí k událostem

V třídě příjemce události lze také použít vnitřní funkci __hook k připojení událostí k obslužným rutinám událostí a funkci __unhook k odpojení od obslužných rutin událostí.K obslužné rutině události lze připojit několik událostí nebo několik obslužných rutin událostí k události.

Vyvolání událostí

Pro vyvolání události je jednoduše možné zavolat metodu deklarovanou jako událost ve třídě zdrojové události.Pokud byly obslužné rutiny připojeny k této události, budou tyto obslužné rutiny zavolány.

Kód události nativního jazyka C++

Následující příklad ukazuje, jak vyvolat událost v nativním jazyce C++.Pro kompilaci a spuštění příkladu je dobré přečíst si komentáře v kódu.

Příklad

Kód

// 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);
}

Výsledek

MyHandler2 was called with value 123.
MyHandler1 was called with value 123.

Viz také

Referenční dokumentace

Zpracování událostí