目录
一. COM是一个更好的 C++ 1. COM 是什么 2. 从 C++ 到 DLL 再到 COM 2.1 C++ 2.2 DLL 2.3 COM 二. COM基础 三. 纯手工创建一个COM组件 附录 |
一、COM是一个更好的C++
1、COM 是什么
Don Box 说"COM IS LOVE"。COM 的全称是 Component Object Model 组件对象模型。
2、从 C++ 到 DLL 再到 COM
2.1 C++
如某一软件厂商发布一个类库(CMath四则运算),此时类库的可执行代码将成为客户应用中不可分割的一部分。假设此类库的所产生的机器码在目标可执行文件中占有4MB的空间。当三个应用程序都使用CMath库时,那么每个可执行文件都包含4MB的类库代码(见图1.1)。当三个应用程序共同运行时,他们将会占用12MB的虚拟内存。问题还远不于此。一旦类库厂商发现CMath类库有一个缺陷后,发布一个新的类库,此时需要要求所有运用此类库的应用程序。此外别无他法了。
图1.1 CMath 的三个客户
2.2 DLL
解决上面问题的一个技术是将CMath类做成动态链接库(DLL ,Dynamic Link Library)的形式封装起来 。
在使用这项技术的时候,CMath的所有方法都将被加到 CMath dll 的引出表(export list)中,而且链接器将会产生一个引入库(import library)。这个库暴露了CMath的方法成员的符号 。当客户链接引入库时,有一些存根会被引入到可执行文件中,它在运行时通知装载器动态装载 CMath Dll。
当 CMath 位于dll中时,他的运行模型见图1.2
图1.2 CMath引入库
2.3 COM
"简单地把C++类定义从dll中引出来"这种方案并不能提供合理的二进制组件结构。因为C++类那既是接口也是实现。这里需要把接口从实现中分离出来才能提供二进制组件结构。此时需要有二个C++类,一个作为接口类另一个作为实现类。让我们开始COM之旅吧。
二、COM基础
1、 COM基本知识
1.1 返回值HRESULT
COM要求所有的方法都会返回一个HRESULT类型的错误号。HRESULT 其实就一个类型定义:
1.
typedef
LONG
HRESULT
;
有关HRESULT的定义见 winerror.h 文件
01.
//
Values are 32 bit values layed out as follows:
02.
//
03.
//
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
04.
//
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
05.
//
+-+----+-------------------------+---------------------------------+
06.
//
|S| Res| Facility | Code |
07.
//
+-+----+-------------------------+---------------------------------+
08.
//
09.
//
where
10.
//
11.
//
S - is the severity code
12.
//
13.
//
0 - Success
14.
//
1 - Error
15.
//
16.
//
Res- is a reserved bit
17.
//
18.
//
Facility - is the facility code
19.
//
20.
//
Code - is the facility''s status code
我们一般下面的宏来判断方法是否成功:
1.