COM 之 com 初谈

原创 2003年08月29日 07:47:00

com初谈

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

先请看看下面几个问题:   

l         什么是com

l         什么是com对象?

l         什么是接口?

    

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

 

什么是com对象

 

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

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

 

什么是接口

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

 

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

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2003-8-282033490.jpg

             

 

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

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

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

 

COM整体模型

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

 

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

 

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

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

                   对象的实例。

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

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

 

 

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

 

CSDN_Dev_Image_2003-8-282033492.jpg

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

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)函数来获取类厂,创建对象的。

      

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

 

COM套间和线程模型

转自http://blog.itpub.net/23410886/viewspace-1032239/ 在看组件的注册表时,对TreadingModel很不理解,所以网上查阅总结了下。大部分...
  • xbgprogrammer
  • xbgprogrammer
  • 2016年08月08日 15:10
  • 431

.com .com .com .com .com .com .com.com .com .com .com .com .com .com.com .com .com .com .com .com .c

.com .com .com .com .com .com .com .com .com .com .com .com .com .com.com .com .com .com .com .com ...
  • XiaoHu1234567890
  • XiaoHu1234567890
  • 2013年10月10日 09:34
  • 100

COM之ActiveX逆向简单方法

一.前言. 以下IE中ActiveX控件中对调用的属性,方法等的一些逆向分析纪录文字. 阅读此文你许要一点点的com基础知识.:) 二.认识ActiveX IE中可以调用几乎所有在...
  • farcall
  • farcall
  • 2011年02月26日 03:14
  • 2574

从虚拟化谈起(一)

虚拟化技术指将一台计算机虚拟为多台虚拟计算机(简称虚拟机),即一台计算机上同时运行多个虚拟机。通过虚拟化层(又称为虚拟机监控器,VMM)的模拟,虚拟机的操作系统仍然认为自己是独占一个系统,因此虚拟机可...
  • wsfdl
  • wsfdl
  • 2014年03月20日 00:39
  • 2382

COM组件初学习笔记

COM是微软提出的第一个构件模型,源于OLE: Object Link and Embedding(动态连接和嵌入)。 1、COM(Component Object Mo...
  • angusing
  • angusing
  • 2013年04月02日 16:54
  • 334

Dr GUI谈COM

Dr. GUI on Components, COM, and ATL 从VCKBASE网站上下载了这本电子书,今天看完了Dr. GUI论述COM第二部分.我试着把他翻译下来,以作为学习COM知识的点...
  • pengdekui
  • pengdekui
  • 2004年09月25日 16:40
  • 1126

COM编程精彩实例--COM对象

创建一个COM对象的简单过程: 1)调用COM API接口 ::CoCreateInstance(),可以直接调用或通过一个已经包装的c++类调用。这个调用需要指定两个ID,一个是要实例化的类的ID...
  • zang141588761
  • zang141588761
  • 2016年12月20日 15:28
  • 789

COM组件开发(四)——VC++调用COM组件的方法

ActiveX 控件          对于ActiveX控件,可以在Visual Studio中使用ClassWizard的方法引入,在MFC项目中选择菜单“项目”——> “添加类”——>“Acti...
  • q5806622
  • q5806622
  • 2015年02月16日 15:15
  • 8488

C#与DLL和COM的混合编程(2)-C#调用COM组件

C#调用COM组件这部分描述了在托管代码中调用COM组件的方法,现存的COM组件在托管代码中作为中间件或者独立的功能实体是很有价值的资源  向.NET Framework报露COM组件1. Impor...
  • Net_Ghost
  • Net_Ghost
  • 2006年06月17日 01:08
  • 5370

【VS开发】这就是COM组件

[实例]这就是COM组件 时间 2012-02-21 10:49:15  CSDN博客 原文  http://blog.csdn.net/btwsmile/article/details/72...
  • LG1259156776
  • LG1259156776
  • 2016年04月09日 21:42
  • 2714
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM 之 com 初谈
举报原因:
原因补充:

(最多只允许输入30个字)