现在的位置: 首页 > 综合 > 正文

COM技术初探(一)

2014年01月29日 ⁄ 综合 ⁄ 共 2218字 ⁄ 字号 评论关闭

目录

一. COM是一个更好的 C++
   1. COM 是什么
   2. 从 C++ 到 DLL 再到 COM
      2.1 C++
      2.2 DLL
      2.3 COM

二. COM基础
   1. COM基本知识
      1.1 返回值HRESULT
      1.2 初识idl
      1.3 IUnkown接口
   2. 一个比较简单的COM
      2.1 interface.h文件
      2.2 math.h文件
      2.3 math.cpp文件
      2.4 simple.cpp文件
      2.5 Math组件的二进制结构图
      2.6 小结

三. 纯手工创建一个COM组件
   1. 从建工程到实现注册
      1.1 创建一个类型为win32 dll工程
      1.2 定义接口文件
      1.3 增加注册功能
         1.3.1 增加一个MathCOM.def文件
         1.3.2 DllRegisterServer()和DllUnregisterServer()
      1.4 MathCOM.cpp文件
      1.5 小结
   2. 实现ISmipleMath,IAdvancedMath接口和DllGetClassObject()
      2.1 实现ISmipleMath和IAdvancedMath接口
      2.2 COM组件调入大致过程
      2.3 DllGetClassObject()实现
      2.4 客户端
      2.5 小结
   3. 类厂

附录   
A 我对dll的一点认识
一. 没有lib的dll
   1.1 建一个没有lib的dll
   1.2 调试没有lib的dll
二. 带有lib的dll
   2.1 创建一个带有lib的dll
   2.2 调试带有引用但没有头文件的dll
三. 带有头文件的dll
   3.1 创建一个带有引出信息头文件的dll
   3.2 调试带有头文件的dll
四. 小结

一、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.

抱歉!评论已关闭.