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对象--接口--方法 之间的关系
一幅图:
二句话:
- 一个COM对象,可以有多个接口;一个COM接口可以有多个方法;
- 应用程式找到COM接口,让它提供服务;COM接口提供方法给应用程式调用以实现服务;
Comments: