COM原理
+ -

COM 可连接对象的基本结构

2022-02-10 50 0

可连接对象通过IConnectionPointContainer接口管理所有的出接口。

对应每一个出接口,可连接对象又管理一个连接点对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立接收器与可连接对象的连接。由于连接点对象被包含在可连接对象的内部,所以连接点对象既可访问可连接对象的内部信息,也可访问客户方的接收器。而且连接点对象的引用计数可包含在可连接对象的引用计数内,也就是说,它可直接使用可连接对象的引用计数。因此,只要连接点存在,可连接对象总不会被释放。
一个可连接对象可支持多个出接口,在IConnectionPointContainer接口的成员函数中,使用一个枚举器暴露此对象所支持的所有出接口;对每一个出接口的连接点对象,在IConnectionPoint接口中也用一个枚举器管理它所连接的接收器。
通过这两个枚举器的引入,使得可连接对象支持多个出接口,每个出接口支持多个与接收器的连接。

1. 可连接对象(Connectable Objects)

可连接对象只是整个体系结构中的一个环节,实际上可连接对象技术的整体结构包括如下内容:

  • (1)可连接对象。实现IConnectionPointContainer接口;创建至少一个连接点对象;为客户定义一个出接口。
  • (2)客户(Client)。对IConnectionPointContainer接口查询COM对象,以确定对象是否可连接;创建一个实现出接口的接收器对象,该出接口在可连接对象中定义。
  • (3)接收器对象(Sink object)。实现出接口;用于建立到可连接对象的连接。

2.连接点对象(Connection point object)。

连接点对象(Connection point object)实现IConnectionPoint 接口,管理与客户接收器之间的连接。
一个连接点可支持多个建立连接的接收器接口,且每次在该接口上进行方法调用时应该迭代连接列表,该过程被称为多播(Multi-casting)。使用可连接对象,需要理解:可连接对象、每个连接点、每个接收器、及所有枚举器都是独立对象,具有独立的IUnknow实现、独立的引用计数、独立的生命期。使用这些对象的客户必须担负起释放所有引用计数的责任。

注意:一个可连接对象可支持多个客户,及一个客户中的多个接收器;同样,一个接收器可连接到多个可连接对象。
客户除了实现接收器对象外,还必须建立接收器与连接点对象之间的连接关系。首先,接收器对象可支持多个与可连接对象之间的连接。即,写一个接收器对象,它可处理所有其它对象发来的事件或请求,这样便于把事件集中处理。一般来说,可连接对象不应向接收器对象请求其它接口,接收器对象只实现该出接口。

在客户和可连接对象之间建立连接的步骤如下(这个过程由客户控制):

  • 1.客户首先询问对象是否为可连接对象(调用对象的QueryInterface成员函数,请求IConnectionPointContainer接口,如果请求成功,表明为可连接对象,并返回IConnectionPointContainer接口指针,否则表明不是可连接对象,不支持出接口);
  • 2.客户得到IConnectionPointContainer接口指针后,调用其成员函数,获取相应出接口的连接点对象。如果对象支持此出接口,则可得到连接点对象,然后调用连接点对象的IConnectionPoint接口的成员函数建立连接。一旦建立了连接,当可连接对象激发事件或发出请求时,接收器的成员函数就会被调用。如果客户要取消连接,同样调用IConnectionPoint接口的成员函数即可。如果对象可连接,接下来客户尝试在可连接对象中某个连接点上获得一个指向IConnectionPoint接口的指针。
    在IConnectionPointContainer接口中有2个方法可用来获得该指针:FindConnectionPoint和EnumConnectionPoints方法,使用EnumConnectionPoints方法时则需要一些额外的步骤。如果接口指针成功获得,则可连接对象和客户都支持相同的出接口,可连接对象定义并调用出接口,而客户实现该出接口。此时,客户就可通过可连接对象中的连接点进行通信。
  • 3.客户在连接点上调用IConnectionPoint::Advise,建立接收器接口与对象连接点之间的一个连接。调用完成后,对象的连接点就保存一个指向接收器出接口的指针。
  • 4.在IConnectionPoint::Advise中的代码通过传入的接口指针调用QueryInterface,请求要连接点的特定接口标识。
  • 5.对象调用接收器接口中的方法,使用其连接点中保持的指针。
  • 6.客户调用IConnectionPoint::Unadvise断开连接。客户调用IConnectionPoint::Release可连接对象也进行同样的工作;此外客户调用IConnectionPointContainer::Release。

0 篇笔记 写笔记

COM 可连接对象(源对象)
首先 两个概念:入接口 :源对象提供给客户调用的。出接口 :源对象通过此接口可直接或间接调用客户。类似delegate如果一个COM对象支持一个或多个出接口,这样的对象称为可连接对象。有时也称源对象。可连接对象的出接口也是COM接口,它包含一组成员函数,每个成员函数代表了一个事件、一个通知,......
COM 可连接对象的基本结构
可连接对象通过IConnectionPointContainer接口管理所有的出接口。对应每一个出接口,可连接对象又管理一个连接点对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立接收器与可连接对象的连接。由于连接点对象被包含在可连接对象的内部,所以连接点对象......
COM中的可连接对象与连接点机制及其MFC程序实现
本文首先论述可连接对象和连接点机制的原理,然后通过一个示例说明怎样用MFC编程实现可连接对象和内嵌于客户的事件接收器.1、可连接对象和连接点机制的基本原理  为了在组件对象和客户之间提供更大的交互能力,组件对象也需要主动与客户进行通信。组件对象通过出接口(Outgoing Interface)与客......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!