Обработка событий в неуправляемом C++
В собственной обработке событий C++ вы настраиваете источник событий и приемник событий с помощью атрибутов event_source и event_receiver соответственно=type
native
. Эти атрибуты позволяют классам, которые они применяются к событиям пожара и обрабатывать события в собственном контексте, отличном от 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.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по