Obsługa zdarzeń w natywnym kodzie C++
W obsłudze zdarzeń w natywnym C++, ustaw źródło i zdarzenie odbiornika zdarzenia za pomocą atrybutów event_source i event_receiver, odpowiednio określając type=native.Atrybuty te umożliwiają klasom, do których są stosowane, obsługę zdarzeń w kontekście natywnym, non-COM.
Deklarowanie zdarzeń
W klasie źródła zdarzeń, należy użyć słowa kluczowego __event w deklaracji metody, aby zadeklarować metody jako wydarzenie.Upewnij się, aby zadeklarować metodę, ale nie definiować jej, taka czynność wygeneruje błąd kompilatora, ponieważ kompilator definiuje metodę niejawnie, gdy jest wykonywane zdarzenie.Zdarzenia natywne mogą być metodami bez parametrów lub z kilkoma parametrami.Zwracany typ może być typu void lub każdym integralnym.
Definiowanie obsługi zdarzeń
W klasie odbiornika zdarzenia należy zdefiniować procedury obsługi zdarzeń, które są metodami z podpisami (zwracanych typów, wywołującymi konwencje i argumentami), które odpowiadają zdarzeniu, które będą obsługiwać.
Podłączanie zdarzeń obsługi zdarzeń
Również w klasą odbiornika zdarzenia funkcja wewnętrzna __hook umożliwia skojarzenie zdarzeń z obsługą zdarzeń i __unhook, aby odłączyć zdarzenia z obsługi zdarzeń.Można podłączyć kilka zdarzeń do programu obsługi zdarzeń lub obsługi zdarzeń do zdarzenia.
Wyzwalanie zdarzenia
Aby wyzwolić zdarzenie, należy po prostu wywołać metodę zadeklarowaną, jako zdarzenie, w klasie źródła zdarzenia.Jeśli programy obsługi zostały podłączone do zdarzenia, zostanie wywołana metoda obsługi.
Kod zdarzeń w natywnym C++
Poniższy przykład pokazuje jak wyzwolić zdarzenia w natywnym C++.Aby skompilować i uruchomić przykład, zobacz komentarze w kodzie.
Przykład
Kod
// 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);
}
Dane wyjściowe
MyHandler2 was called with value 123.
MyHandler1 was called with value 123.