COM学习漫谈之一

COM(Component Object Model)学习是比较难的,也曾看到一些关于COM的文章,很多不错的程序员都在这上面迷失了。也有很多程序员走了很多弯路才真正了解COM。

最近也在学习COM,看的是《COM原理与应用》,潘爱民著作的。之所以叫COM学习漫谈,有两个原因:一是因为我只是把我学习和了解的概念用文字记下来,这只是我的理解,不保证是正确的(推责任呗!)。二是,我只是讨论COM的一些主要概念,只是泛泛的谈谈。

一,怎么想起来搞COM的。

早些时候并没有COM。

有些程序员想把一个文档贴入(嵌入)至另一个文档中。例如我们现在可以将Word贴入Excel,或是将Excel贴入Word中。这在当时是不可能的,与是程序员开始思考了。

思考的结果是采取[复合文档],也即文档是复合的,一个文档可以由Word+Excel复合而成。这个技术经过发展和泛化,形成了第一代的OLE(Object Linking and Embedding)。我们以后称其为[OLE1]

复合文档虽解决了文件的嵌入问题,但后来发现很多方面都存在这样的问题,像程序与程序模块间也很难相互链接或嵌入。于是想制定一种标准,可以让程序间,模块间,文档间......都可以相应链接和嵌入。这个标准既是:COM标准。

标准制定出来了,意味着大家都必须按照标准来行事。当然[OLE1]也不例外,于是[OLE1]经过按COM标准的重写,形成了第二代的OLE,我们下面称之为[OLE2]。[OLE2]实现了[OLE1]的功能,但是它是按COM标准来写得。

至此,起源介绍完了,整整好:

想在Word中嵌入Excel-->复合文档-->[OLE1]-->[OLE2]

咦!COM哪里去了?

COM是一种标准,本身跟上面的应用不搭旮。因此学习COM与OLE没有必然联系。

二,COM实现。

既然COM是种标准,标准总是要实现的吧,用哪种语言无所谓VC,VB,DELPHI都可以,只是符合COM标准就OK了。[COM的实现(COM对象)]之间按COM标准进行通信。

COM实现是二进制的,他有两个特性:1,语言无关性;2,位置无关性;

三,COM对象--CLSID

COM是以对象形成提供服务的。

在介绍CLSID之前先来说一下GUID。

GUID档案

昵称:GUID
英文名:Global Unique Identifier
中文名:全局唯一标识符
生成方式:GUIDGEN.exe(Visual studio自带工具)
内部构造:
       struct GUID{
            DWORD Data1;       //4个字节:4*8=32 位
            WORD  Data2;       //2个字节:2*8=16 位
            WORD  Data3;
            BYTE  Data4[8];    //8个字节:8*8=64 位
       };
身高:128位 32+16*2+64
擅长:起别人起名字,且不重复

既然COM是以对象提供服务的,我们怎么标识COM对象呢?既然GUID这么擅长给人起名字,我们就用GUID来标识一个COM对象。一个COM对象的GUID标识符我们称之为CLSID。

四,接口--IID

既然COM对象提供服务,他以什么方式提供服务呢?答案:以接口方式提供服务。以方法的方式实现服务的内容。

我们怎么标识接口呢。让GUID给接口也起个名字。

一个接口的GUID标识符我们称之为IID。

五,COM对象--接口--方法 之间的关系

一幅图:

二句话:

  1. 一个COM对象,可以有多个接口;一个COM接口可以有多个方法;
  2. 应用程式找到COM接口,让它提供服务;COM接口提供方法给应用程式调用以实现服务;
@ 2007-06-26 08:00

Comments:

Sharing your thoughts: