Обработка событий в неуправляемом C++

В собственной обработке событий C++ вы настраиваете источник событий и приемник событий с помощью атрибутов event_source и event_receiver соответственно=typenative. Эти атрибуты позволяют классам, которые они применяются к событиям пожара и обрабатывать события в собственном контексте, отличном от COM.

Примечание.

Атрибуты событий в собственном языке C++ несовместимы со стандартом C++. Они не компилируются при указании /permissive- режима соответствия.

Объявление событий

В исходном классе событий используйте __event ключевое слово в объявлении метода для объявления метода в качестве события. Обязательно объявите метод, но не определите его. Если это сделать, он создает ошибку компилятора, так как компилятор определяет метод неявно при его создании в событие. Собственные события могут быть методами с нулевым или большим количеством параметров. Возвращаемый тип может быть void или любой целочисленный тип.

Определение обработчиков событий

В классе приемника событий определяется обработчики событий. Обработчики событий — это методы с сигнатурами (возвращаемыми типами, соглашениями о вызовах и аргументами), которые соответствуют событию, которое они будут обрабатывать.

Перехватывание обработчиков событий к событиям

Кроме того, в классе приемника событий используется встроенная функция __hook для связывания событий с обработчиками событий и __unhook отключения событий от обработчиков событий. Можно прикрепить несколько событий к обработчику событий либо несколько обработчиков событий к одному событию.

События стрельбы

Чтобы вызвать событие, вызовите метод, объявленный как событие в исходном классе события. Если обработчики прикреплены к событию, они будут вызваны.

Собственный код события C++

В следующем примере демонстрируется порождение события в собственном коде C++. Для компиляции и выполнения примера см. комментарии в коде. Чтобы создать код в интегрированной среде разработки Visual Studio, убедитесь, что /permissive- параметр отключен.

Пример

Код

// evh_native.cpp
// compile by using: cl /EHsc /W3 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);
}

Выходные данные

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

См. также

Обработка событий