__unhook
关键字
取消处理程序方法与事件的关联。
注意
本机 C++ 中的事件特性与标准 C++ 不兼容。 指定 /permissive-
一致性模式时,它们不会编译。
语法
long __unhook(
&SourceClass::EventMethod,
source,
&ReceiverClass::HandlerMethod
[, receiver = this]
);
long __unhook(
interface,
source
);
long __unhook(
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
指向要从事件中解除挂钩的事件处理程序方法的指针。 处理程序被指定为类的方法或对同一方法的引用;如果不指定类名,__unhook
会假定该类是在其中调用它的类。
本机 C++ 事件:
ReceiverClass
是事件接收器类,HandlerMethod
是处理程序。COM 事件:
ReceiverClass
是事件接收器接口,HandlerMethod
是其处理程序之一。托管事件:
ReceiverClass
是事件接收器类,HandlerMethod
是处理程序。
receiver
(可选)指向事件接收器类的实例的指针。 如果不指定接收器,则默认为在其中调用 __unhook
的接收器类或结构。
使用情况
可以在事件接收器类之外的任何函数范围内使用,包括 main
。
备注
使用事件接收器中的内部函数 __unhook
取消处理程序方法与事件方法的关联或从事件方法“解除挂钩”处理程序方法。
__unhook
有三种形式。 在大多数情况下,可以使用第一种 (four-argument) 形式。 只能将 __unhook
的第二种 (two-argument) 形式用于 COM 事件接收器;它将解除挂钩整个事件接口。 可以使用第三种 (one-argument) 形式从指定的源中解除挂钩所有委托。
非零返回值指示已发生错误(托管事件将引发异常)。
如果对尚未挂钩的事件和事件处理程序调用 __unhook
,它将不起作用。
在编译时,编译器将验证事件是否存在,并利用指定的处理程序执行参数类型检查。
可以在事件接收器外部调用 __hook
和 __unhook
,COM 事件除外。
使用 __unhook
的替代方法是使用 -= 运算符。
有关采用新语法对托管事件进行编码的信息,请参阅事件。
注意
模板化的类或结构不能包含事件。
示例
有关示例,请参阅本机 C++ 中的事件处理和 COM 中的事件处理。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈