使用 IConnectionPointContainer

可连接对象实现 IConnectionPointContainer(并通过 QueryInterface 将其公开),以指示传出接口是否存在。 对于每个传出接口,可连接对象管理连接点子对象,该子对象本身实现 IConnectionPoint。 因此,可连接对象包含连接点,因此命名 IConnectionPointContainerIConnectionPoint

通过 IConnectionPointContainer,客户端可以执行两个操作。 首先,如果客户端已有它支持的传出接口的 IID,则可以使用 IConnectionPointContainer::FindConnectionPoint 找到 IID 的相应连接点。 客户端无法直接查询连接点,因为可连接对象与其包含的连接点之间存在容器/包含的关系。 基本上,FindConnectionPoint 是客户端已知 IID 时传出接口的 QueryInterface

其次,客户端可以通过 IConnectionPointContainer::EnumConnectionPoints 枚举可连接对象中的所有连接点。 此方法为单独的枚举器对象返回 IEnumConnectionPoints 接口指针。 通过 IEnumConnectionPoints::Next,客户端可以获取指向每个连接点的 IConnectionPoint 接口指针。

客户端获取 IConnectionPoint 接口后,必须调用 IConnectionPoint::GetConnectionInterface 来确定每个连接点支持的传出接口的 IID。 如果客户端已支持该传出接口,则可以建立连接。 否则,它仍可以通过使用可连接对象类型库中的信息来支持传出接口,以在运行时提供支持。 此方法要求可连接对象支持 IProvideClassInfo 接口。 (请参阅使用 IProvideClassInfo。)

由于枚举器是单独的对象,因此当不再需要枚举器时,客户端必须调用 IEnumConnectionPoints::Release。 此外,每个连接点都是一个对象,该对象具有与包含可连接对象的单独引用计数。 因此,客户端还必须为通过枚举器或 FindConnectionPoint 访问的每个连接点调用 IConnectionPoint::Release。

可连接对象接口