__hook
关键字
将处理程序方法与事件关联。
注意
本机 C++ 中的事件特性与标准 C++ 不兼容。 指定 /permissive-
一致性模式时,它们不会编译。
语法
long __hook(
&SourceClass::EventMethod,
source,
&ReceiverClass::HandlerMethod
[, receiver = this]
);
long __hook(
interface,
source
);
参数
&SourceClass::EventMethod
指向要将事件处理程序方法挂钩到的事件方法的指针:
本机 C++ 事件:
SourceClass
是事件源类,EventMethod
是事件。COM 事件:
SourceClass
是事件源接口,EventMethod
是其方法之一。托管事件:
SourceClass
是事件源类,EventMethod
是事件。
interface
与 receiver
挂钩的接口名称,仅适用于 event_receiver
属性的 layout_dependent
参数为 true
的 COM 事件接收器。
source
指向事件源的实例的指针。 根据 event_receiver
中指定的代码 type
,source
可以是以下类型之一:
本机事件源对象指针。
基于
IUnknown
的指针(COM 源)。托管对象指针(针对托管事件)。
&ReceiverClass::HandlerMethod
指向要挂钩到事件的事件处理程序方法的指针。 处理程序被指定为类的方法或对其的引用。 如果未指定类名,__hook
会假定该类是它从中调用的类。
本机 C++ 事件:
ReceiverClass
是事件接收器类,HandlerMethod
是处理程序。COM 事件:
ReceiverClass
是事件接收器接口,HandlerMethod
是其处理程序之一。托管事件:
ReceiverClass
是事件接收器类,HandlerMethod
是处理程序。
receiver
(可选)指向事件接收器类的实例的指针。 如果不指定接收器,则默认为在其中调用 __hook
的接收器类或结构。
使用情况
可以在事件接收器类的外部的任何函数范围(包括 main)中使用。
备注
使用事件接收器中的内部函数 __hook
将处理程序方法与事件方法关联或挂钩。 随后会在源引发指定事件时调用指定的事件处理程序。 可以将多个处理程序挂钩到单个事件,或将多个事件挂钩到单个处理程序。
__hook
有两种形式。 在大多数情况下,可以使用第一个(四参数)形式,特别是对于 event_receiver
属性的 layout_dependent 参数为 false
的 COM 事件接收器。
在这些情况下,当在其中一个方法上激发事件前,不需要在接口中挂钩所有方法。 只需挂钩处理事件的方法。 只能将 __hook
的第二种(双参数)形式用于其中 layout_dependent
= true
的 COM 事件接收器。
__hook
将返回一个长值。 非零返回值表示发生了错误(托管事件引发了异常)。
编译器将检查是否存在事件以及事件签名是否与委托签名一致。
可以在事件接收器外部调用 __hook
和 __unhook
,COM 事件除外。
使用 __hook
的替代方法是使用 += 运算符。
有关采用新语法对托管事件进行编码的信息,请参阅 event
。
注意
模板化的类或结构不能包含事件。
示例
有关示例,请参阅本机 C++ 中的事件处理和 COM 中的事件处理。
另请参阅
关键字
事件处理
event_source
event_receiver
__event
__unhook
__raise
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈