本书由一流的权威撰写,揭示了COM(组件对象模型)的本质,旨在帮助开发人员真正理解COM的为什么,而不仅限于怎么使用。书中还提供了一个完整的分布式COM应用,演示了各种编程技术。是程序员必备的参考书。
本书适合有经验的软件开发人员阅读,也可作高校计算机相关专业软件组件课的教材。
译 序
Charlie Kindel序
Grady Booch序
前 言
第1章 COM是一个更好的C++
1. 1 软件分发和C++
1. 2 动态链接和C++
1. 3 C++和可移植性
1. 4 封装性和C++
1. 5 把接口从实现中分离出来
1. 6 抽象基类作为二进制接口
1. 7 运行时多态性
1. 8 对象扩展性
1. 9 资源管理
1. 10 我们走到哪儿了?
第2章 接口
2. 1 再谈接口与实现
2. 2 IDL
2. 3 方法和结果
2. 4 接口和IDL
2. 5 IUnknown
2. 6 资源管理和IUnknown
2. 7 类型强制转换和IUnknown
2. 8 实现IUnknown
2. 9 使用COM接口指针
2. 10 优化QueryInterface
2. 11 数据类型
2. 12 IDL属性和COM属性
2. 13 异常
2. 14 我们走到哪儿了?
第3章 类
3. 1 再谈接口与实现
3. 2 类对象
3. 3 激活
3. 4 使用SCM
3. 5 类和服务器
3. 6 一般化(generalization)
3. 7 优化(Optimization)
3. 8 再论接口与实现
3. 9 名字对象和组合
3. 10 名字对象和永久性
3. 11 服务器生命周期
3. 12 类和IDL
3. 13 类模仿(class emulation)
3. 14 组件类别
3. 15 我们走到哪儿了?
第4章 对象
4. 1 再谈IUnknown
4. 2 QueryInterface是对称的
4. 3 QueryInterface是可传递的
4. 4 QueryIRterface是自反的
4. 5 对象具有静态类型
4. 6 唯一性和对象实体身份
4. 7 QueryIntedace和IUnknown
4. 8 多重接口和方法名字
4. 9 动态复合
4. 10 二进制复合
4. 11 包容
4. 12 我们走到哪儿了?
第5章 套间
5. 1 再谈接口和实现
5. 2 对象. 接口和套间
5. 3 跨套间访问
5. 4 进程内列集辅助函数
5. 5 标准列集结构
5. 6 实现接口列集器
5. 7 标准列集. 线程和协议
5. 8 生命周期管理和列集
5. 9 自定义列集
5. 10 自由线程列集器
5. 11 我们走到哪儿了?
第6章 应用
6. 1 进程内激活的缺陷
6. 2 激活和SCM
6. 3 再谈服务器生命周期
6. 4 应用ID
6. 5 COM和安全性
6. 6 通过编程实现安全性
6. 7 访问控制
6. 8 令牌管理
6. 9 我们走到哪儿了?
第7章 杂项
7. 1 指针基础
7. 2 指针和内存
7. 3 数组
7. 4 流程控制
7. 5 动态与静态调用
7. 6 双向接口协议
7. 7 IDL中的别名技术
7. 8 异步方法
7. 9 我们走到哪儿了?
附录A 对象技术的演变
附录B 代码摘录
COM Chat:一个基于COM的聊天程序
我的工作终于完成了。在终于把被许多人称之为“COM的口述历史”写成一本书之后,我终于可以休息了。这本书反映了我自己对Microsoft于1993年展示给程序设计世界的这项恶梦般的技术的理解过程。虽然我没有参加最初的OLE专业开发人员研讨会,但是我却感到自己好像一直在从事COM有关的工作。四年来一直在与COM打交道,使我几乎不能记起在COM出现之前的计算时代。然而,我仍然清晰地记得1994年初我迁移到COM王国时的痛苦。
我几乎花了六个月的时间才对COM有所感觉。有所理解。在与COM朝夕共处的最初六个月时间里,我能够成功地编写COM程序,也总能够解释为什么这些程序能够工作。然而,我对于“为什么COM编程模型要被设计成这样”则不能够有整体上的理解。幸运的是,有一天(1994年8月8日,在购买了《Inside OLE》一书大约半年之后),我突然有如得到神的启示一般,COM对我变得再明白不过。这并不是说我理解了所有的接口和API函数,而是理解了隐藏在COM背后的动机。从这一刻起,“如何把COM编程模型应用到每天的编程工作中”对我也变得再明白不过。许多程序开发人员也有类似的体验。当我写这份前言的时候,又有三个8月过去了,但是开发人员仍然必须要走过这6个月的等待期,才能够成为COM社会中具有生产能力的一员。我期望这本书能够缩短这个等待周期,但是我不做任何承诺。
正如这本书所强调的,COM更像是一门程序设计的学科,而不是一项技术。为此,我并不打算用每一个接口的每一个方法的每一个参数的细节描述来惊吓读者。相反,我尽量提取出COM的本质,让SDK文档来填补每一章留下的空隙。无论何地,只要有可能,我就尽量指出激发COM某一要素的底层张力(动机),而不是提供细节例子来展示如何把每个接口和API函数应用到人为构造的例子程序中。我自己的经验表明,只有理解了“为什么(why)”,那么关于“怎么做(how)”的问题自然迎刃而解。相反地,仅仅知道了“怎么做(how)”,则并不能够提供对文档背后内容的足够的洞察力。如果你希望跟上编程模型的演化与发展的话,那么这种洞察力非常重要。
对于建立一个分布式的面向对象系统而言,COM是一个非常灵活的基础。为了充分发挥COM的灵活性,你必须经常超越SDK文档、文章或者书籍以外的限制。我个人的建议是,你可以假定所看到的任何事物(包括这本书)可能都是不正确的,或者已经过时了,然后设法形成你自己对编程模型的理解。理解编程模型最可靠的方法是抓住COM的基本词汇表,并精通这些词汇的语义。这恐怕只能通过“编写COM程序并分析这些程序为什么能够按预定的方式工作”才能够获得。阅读书籍、文章和文档当然有用,但是最终还是要将时间花在对COM四个核心概念(接口、类、套间和安全性)的思考上,这样才能使你成为一个有效的开发人员。
为了帮助读者专注于这些核心概念,我尽量包含尽可能多的代码,但是仅限于简单地提供这些源代码,而不作仔细推敲。为了确保COM编程技术也能够出现在文字之中,附录B包含一个完整的COM应用,它也是本书所讨论的众多概念的一个综合例子。而且,本书提供了一些可从网络下载的例子,其中包括一个COM工具代码库,这个代码库在我自己的开发工作中非常有用。这个库的某些部分在本书有详细的讨论,但是包含整个库,仅仅是为了演示如何构造标准的C++实现。同时也请注意,每一章出现的许多代码都用到了C运行库的宏assert来强调某些必须满足的前后条件。在软件产品的代码中,这些assert语句大多应该用更宽大的错误处理代码来取代。
出版书籍的一个缺点是,当这本书到达各地书店时,它往往已经过时了。这本书也不例外。特别是, 目前尚未定型的COM+和Windows NT 5.0(译注1)必定使本书许多内容不正确或者不完整。我尽力预言Windows NT 5.0将会带来的有关模型的变化,然而,在我现在写这份前言的时候,Windows NT 5.0尚未进入公开的Beta测试,所有的信息都有可能发生变。COM+承诺将这个模型进一步发展,然而,我不可能既要把COM+包括进来,同时仍能在今年交出书稿。我鼓励你在拿到了Windows NT 5.0和COM+之后,认真地研究它们。
我必须做出一个痛苦的决定,如何在众多的商业库中选出一个库来实现COM组件(用C++语言)。在观察了各个Internet讨论组上常见的问题之后,我决定放弃ATL和MFC,而把焦点集中在每个开发人员必须要面对的COM主题上,不管他们使用了什么样的库都无法回避这些主题。越来越多的开发人员在产生了一大堆ATL代码之后,奇怪为什么这些代码不能正常工作。我坚信,一个人不可能在ATL和MFC的开发过程中学习COM。这并不是说ATL和MFC不是开发COM组件的有效工具,我的意思是它们不适合用来演示或者学习COM编程概念和技术。这对于一本重点集中在COM编程模型的书籍来说,ATL将显得很不合适。幸运的是,大多数开发人员发现,只要理解了COM,那么短时期内就可以精通ATL。
最后,每一章开始时的引语使我有机会写出我对书中这一部分的感觉。为了尽可能保持直接的写作风格,我限制这种狂野而跑题的故事在每一章不超过15行C++代码。通常,这个引用代码代表了这一章将要面对的概念或者问题在COM之前的做法。或许读者根据这些代码可以分析出我根据这些提示写出这一章内容时的心态。