可连接对象的体系结构

可连接对象只是可连接对象整体体系结构的一部分。 此技术包含以下元素:

  • 可连接对象。 实现 IConnectionPointContainer 接口;创建至少一个连接点对象;为客户端定义一个传出接口。
  • 客户端。 查询 IConnectionPointContainer 对象,以确定该对象是否可连接;创建一个接收器对象,以实现由可连接对象定义的传出接口。
  • 接收器对象。 实现传出接口;用于建立与可连接对象的连接。
  • 连接点对象。 实现 IConnectionPoint 接口并管理与客户端接收器的连接。

客户端、可连接对象、连接点和接收器之间的关系如下图所示:

Diagram that shows the connection points between the Client and Connectable Object.

在上图步骤 3 中,连接点对象调用接收器接口中的方法之前,必须 QueryInterface 查询所需的特定接口,即使在步骤 2 调用 Advise 方法时已经传递了指针。

该体系结构还涉及两个枚举器对象,但未在图中显示。 其中一个由 IConnectionPointContainer 中的方法创建,用于枚举可连接对象中的连接点。 另一个是由 IConnectionPoint 中的方法创建的,用于枚举当前与该连接点建立的连接。 一个连接点可支持多个已连接的接收器接口,每次对该接口进行方法调用时,都应遍历连接列表。 此过程称为多播。

在使用可连接对象时,必须了解可连接对象、每个连接点、每个接收器以及所有枚举器都是单独的对象,它们具有单独的 IUnknown 实现、单独的引用计数和单独的生命周期。 使用这些对象的客户端始终要负责任释放其拥有的所有引用计数。

注意

一个可连接对象可支持多个客户端,并可在一个客户端内支持多个接收器。 同样,一个接收器可以连接多个可连接对象。

 

在客户端和可连接对象之间建立连接的步骤如下:

  1. 客户端会查询对象上的 IConnectionPointContainer 以确定对象是否可连接。 如果调用成功,客户端将持有指向可连接对象上 IConnectionPointContainer 接口的指针,并且可连接对象引用计数器已递增。 否则,对象将不可连接,也不支持传出接口。
  2. 如果对象是可连接的,客户机将尝试获取指向可连接对象内连接点上 IConnectionPoint 接口的指针。 在 IConnectionPointContainer::FindConnectionPointIConnectionPointContainer::EnumConnectionPoints 中,有两种方法可以获取该指针。 如果使用 EnumConnectionPoints,还需要执行一些额外的步骤。 (更多信息,请参阅使用 IConnectionPointContainer。)如果成功,则可连接对象和客户端都支持相同的传出接口。 可连接对象将定义并调用它,而客户端将实现它。 然后,客户端就可以通过可连接对象中的连接点进行通信。
  3. 然后,客户端在连接点上调用 Advise,以便在其接收器接口和对象的连接点之间建立连接。 在此调用后,对象的连接点将留有一个指向接收器上输出接口的指针。
  4. Advise 内的代码会在传入的接口指针上调用 QueryInterface 询问它所连接的特定接口标识符。
  5. 该对象使用连接点持有的指针,根据需要调用接收器接口上的方法。
  6. 客户端调用 Unadvise 终止连接。 然后,客户端调用 IConnectionPoint::Release 释放对连接点的控制,因此也释放了主可连接对象。 客户端还必须调用 IConnectionPointContainer::Release 来释放对主可连接对象的控制。

可连接对象接口