Udostępnij za pośrednictwem


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.

ee2k0a7d.collapse_all(pl-pl,VS.110).gifKodem 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

ee2k0a7d.collapse_all(pl-pl,VS.110).gifKod

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

ee2k0a7d.collapse_all(pl-pl,VS.110).gifDane wyjściowe

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

Zobacz też

Informacje

Obsługa zdarzeń