微软公司的组件对象模型(COM)作为一种重要的工具已崭露头角,它是微软迈向分布式计算的基础。不论现在还是将来,它都是定制应用程序的一种强大的方法。并且它是OLE和ActiveX的基础。COM帮助你理解未来的程序开发技术,而这本书帮助你理解COM。在本书中你将发现:构建优美的COM组件的清晰、简单、实用的规则;COM是如何易学易用,特虽是对那些熟练掌握C++的人;循序渐进地介绍COM设计;以代码形式给出的大量实例。
《COM技术内幕》适合于中、高级C++程序员;COM、ActiveX和OLE程序员;对组件设计感兴趣的研究人员;以及那些当COM移植到UNIX、MVS和其他环境时想要使用到COM的程序员。
引言
第1章 组件
1.1 使用组件的优点
1.1.1 应用程序定制
1.1.2 组件库
1.1.3 分布式组件
1.2 对组件的需求
1.2.1 动态链接
1.2.2 信息封装
1.3 COM
1.3.1 COM组件是
1.3.2 COM不是
1.3.3 COM库
1.3.4 COM方法
1.3.5 COM超越了用户的需要
1.4 本章小结
第2章 接口
2.1 接口的作用
2.1.1 可复用应用程序架构
2.1.2 COM接口的其他优点
2.2 COM接口的实现
2.2.1 编码约定
2.2.2 一个完整的例子
2.2.3 非接口通信
2.2.4 实现细节
2.3 接口理论:第二部分
2.3.1 接口的不变性
2.3.2 多态
2.4 接口的背后
2.4.1 虚拟函数表
2.4.2 vtbl指针及实例数据
2.4.3 多重实例
2.4.4 不同的类, 相同的vtbl
2.5 本章小结
第3章 QueryInterface函数
3.1 接口查询
3.1.1 关于IUnknown
3.1.2 IUnknown指针的获取
3.1.3 关于QuerInterface
3.1.4 QuerInterface的使用
3.1.5 QuerInterface的实现
3.1.6 关于类型转换
3.1.7 一个完整的例子
3.2 关于QuerInterface的实现规则
3.2.1 同一IUnknown
3.2.2 客户可以获取曾经得到过的接口
3.2.3 可以再次获取已经拥有的接口
3.2.4 客户可以从任何接口返回到起始接口
3.2.5 若能够从某接口获取某特定接口, 则从任意接口都将能够获取此接口
3.3 QuerInterface定义了组件
3.3.1 接口集
3.4 新版本组件的处理
3.4.1 何时需要建立一个新版本
3.4.2 不同版本接口的命名
3.4.3 隐含合约
3.5 本章小结
第4章 引用计数
4.1 生命期控制
4.2 引用计数简介
4.2.1 引用计数简介
4.2.2 AddRef和Release的实现
4.3 何时进行引用计数
4.3.1 引用计数的优化
4.3.2 引用计数规则
4.4 本章小结
第5章 动态链接
5.1 组件的创建
5.1.1 从DLI中输出函数
5.1.2 DLL的装载
5.2 客户和组件的划分
5.2.1 程序清单
5.3 对象串
5.4 本章小结
第6章 关于HRESULT. GUID. 注册表及其他细节
6.1 HRESULT
6.1.1 HRESULT值的查找
6.1.2 HRESULT值的使用
6.1.3 用户自己代码的定义
6.2 GUID
6.2.1 为什么要使用GUID
6.2.2 GUID的声明和定义
6.2.3 GUID的比较
6.2.4 将GUID作为组件标识符
6.2.5 通过引用传递GUID值
6.3 Windows注册表
6.3.1 注册表的组织
6.3.2 注册表编辑器
6.3.3 CLSID关键字结构
6.3.4 关于注册表的其他细节
6.3.5 ProgID
6.3.6 自注册
6.3.7 组件类别
6.3.8 OleView
6.4 COM库函数
6.4.1 COM库的初始化
6.4.2 内存管理
6.4.3 将字符串转化成GUID
6.5 本章小结
第7章 类厂
7.1 CoCreateInstance
7.1.1 CoCreateInstance的声明
7.1.2 CoCreateInstance的使用
7.1.3 类上下文
7.1.4 客户程序清单
7.1.5 CoCreateInstance的不灵活性
7.2 类厂
7.2.1 CoCetClassObject
7.2.2 IClassFactory
7.2.3 CoCreateInstance与CoGetClassObject的比较
7.2.4 类厂的若干特性
7.3 类厂的实现
7.3.1 DllGetClassObject的使用
7.3.2 组件的创建过程
7.3.3 组件代码清单
7.3.4 流程控制
7.3.5 组件的注册
7.4 同一DLL中的多个组件
7.4.1 类厂实现的复用
7.5 DLL的卸载
7.5.1 DllCanUnloadNow的使用
7.5.2 LockServer
7.6 本章小结
第8章 组件复用:包容与聚合
8.1 包容和聚合
8.1.1 包容简介
8.1.2 聚合简介
8.1.3 包容与聚合的比较
8.2 包容的实现
8.2.1 接口扩展
8.3 聚合的实现
8.3.1 QueryInterface的实现
8.3.2 不正确的IUnknown
8.3.3 聚合的未知接口
8.3.4 内部组件的创建
8.3.5 外部组件中指向内部组件接口的指针
8.4 一个完整的例子
8.4.1 盲目聚合
8.5 现实世界中的聚合和包容
8.5.1 组件的内部状态信息
8.5.2 虚拟函数的模拟
8.6 本章小结
第9章 编程工作的简化
9.1 客户端的简化
9.1.1 智能接口指针
9.1.2 C++包装类
9.2 服务器端的简化
9.2.1 未知接口基类
9.2.2 类厂基类
9.2.3 CUnknown和CFactory的使用
9.2.4 集成步骤
9.3 本章小结
第10章 EXE中的服务器
10.1 不同的进程
10.1.1 本地过程调用
10.1.2 调整
10.1.3 代理/残根DLL
10.2 IDL/MIDL简介
10.2.1 关于IDL
10.2.2 IDL接口描述举例
10.2.3 MIDL编译器
10.3 本地服务器的实现
10.3.1 示例程序的运行
10.3.2 去掉入口点函数
10.3.3 类厂的启动
10.3.4 对LockServer的修改
10.4 远程访问能力
10.4.1 DCOMCNFG.EXE所完成的工作
10.4.2 工作机理
10.4.3 其他DCOM信息
10.5 本章小结
第11章 调度接口与自动化
11.1 一种新的通信方式
11.1.1 旧的通信方式
11.1.2 IDispatch接口
11.2 IDispatch的使用
11.2.1 Inuoke函数的参数
11.2.2 示例
11.2.3 VARIANT类型
11.2.4 BSTR数据类型
11.2.5 SAFEARRAY类型
11.3 类型库
11.3.1 类型库的创建
11.3.2 类型库的使用
11.3.3 注册表中的类型库
11.4 IDispatch接口的实现
11.4.1 异常的引发
11.4.2 参数调整
11.5 本章小结
第12章 多线程
12.1 COM线程模型
12.1.1 WIN32线程
12.1.2 COM线程
12.1.3 套间
12.1.4 套间线程
12.1.5 自由线程
12.1.6 调整与同步
12.2 套间线程的实现
12.2.1 自动调整
12.2.2 手工调整
12.2.3 编码
12.2.4 对套间线程例子的说明
12.3 自由线程的实现
12.3.1 对自由线程例子的说明
12.3.2 自由线程参数调整的优化
12.4 关于线程模型的注册表关键字
12.5 本章小结
第13章 一个完整的例子
13.1 Tangram程序
13.1.1 Tangram的运行
13.1.2 所用的组件
13.1.3 客户程序
13.1.4 TangramModel组件
13.1.5 TangramGdiVisual和TangramGLVisual组件
13.1.6 TangramGdiWorld和TangramGLWorld组件
13.2 展示
13.3 IDL文件
13.3.1 DLIDATA.C文件
13.4 循环引用计数
13.4.1 不调用AddRef
13.4.2 使用显示终止
13.4.3 使用一个单独的组件
13.5 事件和连接点
13.5.1 IEnumXXX
13.6 本章小结
结束语
童年时玩过的积木块、七巧板等玩具至今仍时常引起我美好的回忆,那时的我时常沉浸在一种忘我的想象中,用那些简单的形状构造出自己能够想象得到的各种千奇百怪的物体。上了大学,接触到UNIX,我又深深地为它所提供的各种功能专一、小巧灵活的实用工具所折服:通过管道,我可以把那些精巧的小程序组合起来,构造出各种功能复杂的工具,实现单个程序达不到的功能。
初次接触到COM(组件对象模型)这个概念,我首先想到的就是积木玩具和UNIX中那些小巧的实用程序。人类孜孜以求的目标就是将自然改造得更加符合自己的需要,让自然物按自己的行为习惯和方式那样工作。而COM正是微软公司为了使计算机工业的灵魂——软件——的生产更加符合人类行为方式而开发的一种新的软件开发技术。
在COM架构下,人们可以开发出各种各样的功能专一的“软件”积木块(组件),然后将它们按照需要“搭”起来,构成复杂的应用系统。由此带来的好处是多方面的:可以将系统中的组件用新的组件替换掉,以随时进行系统的升级与定制;可以在多个应用系统中重复利用同一个组件;可以方便地将应用系统扩展到网络环境下;COM与语言、平台无关的特性使得所有的程序员均可充分发挥自己的才智与专长编写出组件模块;等等。
Dale Rogerson是微软公司的资深技术人员,对微软各种技术的背景有着极为深刻的了解。由他所著的《COM技术内幕》是一部全面、系统介绍COM技术的著作。为了及时将COM这一最新的软件开发方法与思想介绍给国内的读者,我们决定将这本书翻译出来,以期能够为国内的软件业的发展做出一定的贡献!
由于时间仓促,同时限于对COM的认识与理解程度,书中的错误与不足之处在所难免,恳请读者不吝指正。