可连接对象的体系结构
可连接对象只是可连接对象的整体体系结构的一部分。 此技术包括以下元素:
- 可连接对象。 实现 IConnectionPointContainer 接口;创建至少一个连接点对象;定义客户端的传出接口。
- 客户。 查询 IConnectionPointContainer 的对象以确定对象是否可连接;创建接收器对象以实现可连接对象定义的传出接口。
- 接收器对象。 实现传出接口;用于建立与可连接对象的连接。
- 连接点对象。 实现 IConnectionPoint 接口,并管理与客户端接收器的连接。
下图说明了客户端、可连接对象、连接点和接收器之间的关系:
在上图中步骤 3 中的接收器接口中调用连接点对象之前,它必须为所需的特定接口 QueryInterface,即使该指针已在步骤 2 调用中传递给 建议 方法。
此体系结构中也涉及两个枚举器对象,但图中未显示。 其中一个是由 IConnectionPointContainer 中的方法创建的,用于枚举可连接对象中的连接点。 另一种方法是通过 IConnectionPoint 中创建的,以枚举当前与该连接点建立的连接。 一个连接点可以支持多个连接的接收器接口,并且每次对该接口进行方法调用时,它都应循环访问连接列表。 此过程称为多播。
使用可连接对象时,请务必了解可连接对象、每个连接点、每个接收器和所有枚举器都是单独的对象,具有单独的 IUnknown 实现、单独的引用计数和单独的生存期。 使用这些对象的客户端始终负责释放它拥有的所有引用计数。
注意
可连接对象可以支持多个客户端,并且可以在客户端中支持多个接收器。 同样,接收器可以连接到多个可连接对象。
在客户端和可连接对象之间建立连接的步骤如下:
- 客户端查询对象上的 IConnectionPointContainer,以确定该对象是否可连接。 如果此调用成功,客户端将保留指向可连接对象的 IConnectionPointContainer 接口的指针,并且可连接对象引用计数器已递增。 否则,对象不可连接,不支持传出接口。
- 如果对象可连接,客户端接下来会尝试获取指向可连接对象内连接点上的 IConnectionPoint 接口的指针。 获取此指针的方法有两种,这两种方法均在 IConnectionPointContainer::FindConnectionPoint 和 IConnectionPointContainer::EnumConnectionPoints中。 如果使用 EnumConnectionPoints,则需要执行一些额外的步骤。 (有关详细信息,请参阅 使用 IConnectionPointContainer。如果成功,可连接对象和客户端都支持相同的传出接口。 可连接对象定义它并调用它,客户端实现它。 然后,客户端可以通过可连接对象中的连接点进行通信。
- 然后,客户端调用 建议 连接点,以在其接收器接口与对象的连接点之间建立连接。 在此调用后,对象的连接点保存指向接收器上的传出接口的指针。
- 建议内的代码 调用传入的接口指针上的 queryInterface,请求它连接到的特定接口标识符。
- 该对象根据需要调用接收器接口上的方法,并使用连接点持有的指针。
- 客户端调用 取消 终止连接。 然后,客户端调用 IConnectionPoint::Release 释放其对连接点的保留,因此,主可连接对象也释放其保留。 客户端还必须调用 IConnectionPointContainer::Release 以释放对主可连接对象的保留。
相关主题