COM 学习笔记(一)
现在用.NET开发一些COM都十分傻瓜化,我做Office COM Addin 时就是这种感觉,作为学习者,觉得对稍底层的实现机制不了解,也不是件好事,借了一本 COM Programming by Example 学习一下,并作了些学习笔记。
COM 学习笔记(一)
1.1 什么是COM
COM(Component Ojbect Model 构建对象模型)是一类系统应用程序接口(API),它允许你的应用程序访问其他应用程序(EXE)和动态链接库(DDL)。遵守一定的标准和协议,实现一定的功能。
1.2 为什么要开发COM
一个问题:字处理器中编辑一封信,需要一个电子表格,如何不退出字处理器就能完成电子表格的编辑?
解决方案是OLE(对象的链接和嵌入)技术,它包含一些复杂的API,大部分功能在OLE32.DLL里。OLE的第二版中,修改了OLE32.DLL,允许一个应用程序访问另一个应用程序。这个API,一般都把它认为COM API。
1.3 COM还有什么用
创建OLE控件(供Visual Basic程序用),后来控件可从Web浏览器下载,叫做ActiveX。
写C/S程序时用作基本框架,使C和S数据交换一定程度透明,提供一套API方法。
为使用DLL的C/C++程序服务,LoadLibrary()选择性链入DLL,COM有更强大的方法,且COM提供一种机制,只需更新DLL,不用更新整个应用程序。
COM支持多语言的共同开发(VB,C等),把工程分为几个DLL构件,每个构件可以随便选择一种语言。
现在很多程序都是分为几个COM对象的。
1.4 COM如何工作
如果使用VB,VJ++语言,已经屏蔽了COM的实现细节。如果使用C++,就需要对COM实现机制深入了解。
用C++创建一个COM对象的简单过程:
(1) 调用COM API 接口 ::CoCreateInstance(),可以直接调用或通过一个已经包装的C++类调用。需要指定两个ID,一个是实例化的类ID,一个是对象所在DLL或EXE文件的ID (使用唯一的ID标志,不使用类名或文件名)。
(2) 系统通过给出的第二个ID,检查注册表,将其转化为真实的文件名。
(3) 获得真实文件名后,COM调用LoadLibrary()装载所需的DLL,或通过远程过程调用(RPC)API启动相应的EXE文件。
(4) COM根据第一个ID(实例化的类的)通知DLL或EXE要实例化哪个类,在DLL或EXE创建对象后,::CoCreateInstance()返回对象的指针。
(5) 类(对象)在本机的DLL中,方法调用和参数传递同一般DLL,p->Func(a,b);
(6) 对象在EXE中创建或在其他机器上,调用方法时需要一个序列化过程。
(7) 释放COM对象指针,将其引用计数减1,降至0时,COM通过卸载DLL或停止执行EXE真正消灭对象。
浙公网安备 33010602011771号