Welcome

首页 / 软件开发 / C++ / COM原理及应用----可连接对象

COM原理及应用----可连接对象2011-04-041、COM的高级特性

COM规范中有一些高级特性,如可连接对象、永久存储、一致的数据传输等,使COM规范具有更强的生命力,它们也是OLE的基础,但它们的应用又不仅仅局限于OLE,这些高级特性已经广泛应用于Windows操作系统上。

2、入接口、出接口与接收器

入接口(incoming interface)是组件暴露给客户,被动地监听并为客户请求作出反应的接口。而出接口(outgoing interface)是指组件主动与客户进行通信的接口。

出接口不是由对象实现的,而是由客户程序来实现,客户实现这些接口,并把接口指针告诉对象,以后对象利用此接口指针与客户进行通信。在客户程序方,实现这些接口的对象被称为接收器(sink)。接收器本身也是一个COM对象,但它往往比较简单,只用于监听处理组件对象的通知或请求。

客户与对象之间的关系是相对的,入接口和出接口也是一个相对概念,它们只用于通信的一个方向。

3、可连接对象

如果一个COM对象支持一个或多个出接口,则称这样的对象为可连接对象(connectable object),或称为源对象(source)。

可连接对象的出接口也是COM接口,它包含一组成员函数,每个成员函数代表了一个事件(event)、一个通知(notification)或者一个请求(request)。

4、事件、通知与请求

事件和通知在概念上是完全一致的,只是用在不同的场合,例如在COM对象中当某个属性被改变时,它可以给客户发送一个通知;而当特定事情发生时,比如定时消息或用户鼠标操作发生时,对象产生一个事件,客户程序可以处理这些事件。然而,请求的概念则稍有不同,对象给客户发出请求,它希望客户能提供某些信息,期望客户能有应答。

从COM规范的意义上来讲,不管是事件、通知还是请求,它们都通过出接口的成员函数来实现。

5、客户与可连接对象的关系

虽然接收器也是一个COM,但它有特殊性,它位于客户程序内部,并不需要通过COM库来创建,所以接收器并不需要CLSID来标识,也不需要类厂,接收器的标识和创建过程完全是客户程序内部的事情。对于客户程序外部而言,接收器也是一个单独的COM对象,它有自己的引用计数,有自己的接口查询方法,即 QueryInterface成员函数。COM只要求接收器是一个独立的COM对象,COM规范对接收器的实现没有任何限制。

一般可连接对象不应该向接收器对象请求其他的接口,即不应该调用接收器的QueryInterface成员函数。接收器通常专用于某个出接口指针,接收器对象只实现该出接口,当然出接口是基接口(比如IUnknown)除外。

可连接对象和接收器可以形成一对多或者多对一的关系,也即客户与可连接对象之间可以是一对多或者多对一的关系。

6、可连接对象的基本结构

可连接对象可以支持一个或多个出接口,它通过接口IConnectionPointContainer管理所有的出接口。对应于每个出接口,可连接对象又管理了一个称为连接点(connection point)的对象,每一个连接点对象实现了IConnectionPoint接口,客户通过连接点对象建立接收器与可连接对象的连接。连接点即可以访问可连接对象的内部信息,也可以访问客户方的接收器,而其它可以直接使用可连接对象的引用计数器。