COM 之 com 初谈

类别:VC语言 点击:0 评论:0 推荐:

com初谈

 

先请看看下面几个问题:   

l         什么是com ?

l         什么是com对象?

l         什么是接口?

    

   先说第一个,com全称是组件对象模型(compoment object model),他是一组规范,是MicroSoft创建的一组二进制和网络标准,用于解决两个组件之间的通信,可以说MicroSoft目前差不多所有的战略都是建于其上,从1993年com 首次被推出,他就注定了MicroSoft的发展的命运……

 

什么是com对象

 

   com是面向对象的软件模型,com对象的概念有点类似于C++中对象的概念。在com规范中,没有com对象的严格定义,com组件提供给客户的是以对象形式封装起来的实体,客户与组件交互的实体是com对象。

   com对象有自己的属性和方法,但这些都被com封装了起来,客户只有通过接口才能对com的方法进行调用,接口是com与外界通信,交互的唯一途径。

 

什么是接口

       上面已经说过了,接口就是com 与外界通信的唯一途径。他的定义是com规范的核心。接口是一组逻辑上相关的函数的集合,他自己可以看作是指向改组函数集合的指针。

 

下图表示了接口和com对象的关系:

             

 

   由上图可见一个com组件主要由两部分组成,一部分是接口的定义,另一部分是com对象的实现,在com规范中接口的定义和com对象的实现是相对独立的。

    接口的定义 ——接口的定义遵循MIDL,他是MicroSoft针对OSF的DCE(Distributes Computing Enviroment)规范中IDL语言扩展。从上图可以看出,接口就是包含了一组函数的数据结构,他只负责定义函数。在对象创建后,他就是包含了接口指针和一个虚函数表,接口指针指向虚函数表(该函数表就成了一组函数指针的集合),每个函数指针指向“com对象实现”里相应的函数的实现。接口规范并不建立在任何编程语言基础上,任何具有足够数据表达能力的语言,都可以对接口进行描述。

    com对象的实现 —— 包含com对象的所有接口的所有函数的实现代码。

 

COM整体模型

       根据com规范所建立的应用是基于Client / Server 模型的,一个完整的com应用包括以下几个部分:com服务器,服务器方com库,客户方com库,客户程序。

 

先对各个部分作个简要说明:

 

com服务器      —— 就是一个容器,此容器用来装所有的com对象

服务器方com库  —— 可以看作是容器的管理者,负责从容器中找出相应的com对象,创建

                   对象的实例。

客户方com库    —— 连接员,负责把客户请求传送到服务方,负责客户com的控制管理

客户程序       —— com服务的享受者。

 

 

一次完整的方法调用包括以下几个步骤:

 

1. 客户程序通知com库,向com库指出他要调用的com对象的GUID或IID;

2. 客户端com库接受客户要求,向服务器端发送该要求,在客户进程内建立该com对象的代

   理DLL(以后客户就同该代理DLL交互)。

3. 服务器com库接受请求,从com库中找出com对象,建立该com对象的实例(组件进

   程),在实例建立时,还会在实例的进程里,创建一个存根dll。组件程序通过该存根

   dll与客户端的存根dll进行交互。

4. 客户程序调用代理dll接口方法;

5. 代理dll把请求接口、方法、参数、数据,打包列集(marshalling);发送给存根dll;

6. 存根dll接收来自代理dll的数据包,散集(Unmarshalling);发送给组件程序;

7. 组件程序处理数据,返回给存根dll;

8. 存根dll列集(marshalling),发送给代理DLL;

9. 代理DLL返回结果给客户程序。

 

[ 注:对于存根和代理,请关注后续文章 ]

      

com对象的创建

 

   com库是如何创建com对象的呢?

    通过类厂,类厂是com对象的生产基地,每个com对象都有一个相应的类厂。类厂本身也是一个com对象,他支持一个接口IClassFactory,该接口的函数CreateInstance(…)用于构造com对象的实例。

   客户创建一个com的过程:

   1. 客户向com库,给出com对象的GUID;

   2. com库调用CoGetClassObject(...)函数获取com对象的类厂,创建com对象.

      

   CoCreateInstance(...)函数,也是通过在其内部调用CoGetClassObject(…)函数来获取类厂,创建对象的。

      

   暂时就到这吧,各位老兄,老姐,如发现有误,或不同观点,还望指出,共同讨论,共同提高啥!

 

本文地址:http://com.8s8s.com/it/it1505.htm