Obsługa zdarzeń w macierzystym C++
W macierzystej obsługi zdarzeń języka C++, ustawić zdarzenia źródło i zdarzenie odbiornika za pomocą źródło_zdarzenia i event_receiver atrybuty, odpowiednio, określając type=native.Atrybuty te pozwalają klas, do których są stosowane do obsługi zdarzeń w kontekście macierzystym, -COM i ognia zdarzenia.
Deklarowanie zdarzeń
W klasie źródła zdarzeń, użyj klasy __event słowa kluczowego w deklaracji metody zadeklarować metody jako wydarzenie.Upewnij się, że zadeklarować metody, ale nie zostanie zdefiniowana Aby to zrobić wygeneruje błąd kompilatora, ponieważ kompilator definiuje niejawnie metodę, przy do zdarzenia.Zdarzenia macierzysty może być metody z parametrami zero lub więcej.Zwracany typ może być typu void lub każdym integralną.
Definiowanie obsługi zdarzeń
Odbiornik klasy event służy do definiowania procedury obsługi zdarzeń, które są metody z podpisami (zwracanymi typami wywoływania konwencje i argumenty), pasujące zdarzenie, które będą je obsługiwać.
Spinanie obsługi zdarzeń do zdarzeń
Również w klasie zdarzeń odbiornika, używana jest funkcja wewnętrzna __hook do kojarzenia zdarzenia z obsługą zdarzeń i __unhook do dissociate zdarzeń z programów obsługi zdarzeń.Można hook kilka zdarzeń do programu obsługi zdarzeń lub kilka programów obsługi zdarzeń na zdarzenie.
Wyzwalania zdarzenia
Ogień zdarzenie, należy po prostu wywołać metody zadeklarowane jako zdarzenie w przypadku klasy źródła.Jeśli obsługi mają zostały przechwycone w taki sposób, aby zdarzenia, zostanie wywołana programów obsługi.
Kodem macierzystym C++ zdarzeń
Poniższy przykład pokazuje, jak na ogień zdarzenie w macierzystym C++.Aby skompilować i uruchomić przykład, zapoznaj się z komentarzy 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.