COM 事件
本主题将概述连接点并介绍通常用于描述 COM 事件的事件相关术语。
连接点在 COM 环境中建立客户端和服务器之间的双向通信。 利用这一机制,COM 服务器可以在发生某一事件时回叫客户端。 例如,服务器(如 Microsoft Internet Explorer)可以引发一个事件,以报告对其客户端程序的更改(如标题更改)。 客户端创建一个称作事件接收器的内部 COM 对象来为传入通知做准备。 一旦收到通知,客户端就可以执行与该事件关联的操作。
事件接收器提供用于向服务器公开事件相关方法的接口。 服务器通过调用这些事件相关方法来引发事件。 客户端会将事件接收接口当作普通的 COM 接口来实现。 服务器将该接口声明为输出接口;COM 服务器的创作者将 source 特性应用于 COM 服务器类型库中的接口。 服务器使用来自事件接收接口的定义来标识 sink 和 invoke 方法。
实现事件接收接口的 COM 客户端通常称作事件接收器,或简称为接收器。 在下图中,接收器实现 ISinkEvents 接口。 引发事件的服务器称作源。
连接点事件模型
当建立事件接收接口后,接收器必须连接到源上。 连接点机制将使用以下协议来连接接收器和源:
接收器对服务器对象查询 IConnectionPointContainer 接口。 如果该对象支持连接点,它将返回一个指针。
接收器使用容器对象的方法来查找表示特定连接点的 IConnectionPoint 接口。 由于服务器可以支持多个输出接口,客户端必须使其接收器匹配特定连接点接口的接口标识符 (IID)。
获取正确的连接点对象后,接收器将调用 IConnectionPoint::Advise 来注册其接收接口指针。 服务器(源)将保持连接(并向其引发事件),直至客户端通过调用 IConnectionPoint::Unadvise 中断连接。
Visual Basic 会隐藏连接点的大多数详细信息;但是,您必须在客户端的服务器声明中包括 WithEvents 指令。 在 C++ 中,客户端代码必须查询 IConnectionPointContainer 和 IConnectionPoint 并对它们调用方法。 服务器实现这两种接口。