本机 C++ 中的事件处理
在处理本机 C ++ 事件时,分别使用 event_source 和 event_receiver 特性设置事件源和事件接收器,并指定 type
=native
。 这些特性允许应用它们的类在本机的非 COM 上下文中激发和处理事件。
注意
本机 C++ 中的事件特性与标准 C++ 不兼容。 指定 /permissive-
一致性模式时,它们不会编译。
声明事件
在事件源类中,使用方法声明上的 __event
关键字将方法声明为事件。 请确保声明方法,但不定义该方法。 如果这样做,它将生成编译器错误,因为编译器在事件中生成时隐式定义方法。 本机事件可以是带有零个或多个参数的方法。 返回类型可以是 void
或任何整型。
定义事件处理程序
在事件接收器类中,定义事件处理程序。 事件处理程序是具有与它们将处理的事件匹配的签名(返回类型、调用约定和自变量)的方法。
将事件处理程序挂钩到事件
同样在事件接收器类中,可使用内部函数 __hook
将事件与事件处理程序关联,并可使用 __unhook
取消事件与事件处理程序的关联。 您可将多个事件挂钩到一个事件处理程序,或将多个事件处理程序挂钩到一个事件。
触发事件
若要触发事件,调用再事件源类中声明为事件的方法。 如果处理程序已挂钩到事件,则将调用处理程序。
本机 C++ 事件代码
以下示例演示如何在本机 C++ 中激发事件。 若要编译并运行此示例,请参考代码中的注释。 若要在 Visual Studio IDE 中生成代码,请验证 /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 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈