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.