
本书不仅介绍了COM的基本原理及其扩展知识,还讲述了MTS及COM+的一些知识。全书分为三部分,第一部分为COM基础,第二部分为COM扩展,第三部分为COM应用与发展,介绍了组件化程序设计思想以及多层软件结构模型。
COM原理与应用序言从酝酿写这本关于COM的书到最后完成本书经历了一年半的时间,整个写作过程甚为艰难,多方面的原因使得本书的写作并不顺利。不过,最后总算完成了预期的目标,当然,是否实现了当初的愿望还得由读者来评判。
促使我写作这本书有多方面的原因。首先,我自己学习COM的时候并不轻松,因为我找不到合适的资料;后来我就去读COM规范,但是COM规范言简意赅,说得很不清楚,经常把我弄得稀里糊涂,后来通过一些实践经验,才明白了很多。其次,很多读者和朋友经常向我咨询如何学习COM,让我推荐一些资料或者参考书,我也就尽我所能,为他们作一些介绍,但很难为他们找到合适的参考书。还有一个更重要的原因是,我看到国内市场上几乎买不到系统介绍COM的中文书,连翻译的书都看不到。由此我就萌生了写作本书的念头。
在本书的写作过程中,我参阅了大量的技术资料,但在讲述COM各项技术时,却并没有直接引用这些资料中的内容,更不是简单的翻译。我希望能够根据我在学习COM过程中的一些体会制定出一个合理的学习顺序,引导读者走上学习COM的捷径;我也希望能够把我对COM的理解融入书中,使读者更快地领会COM的技术精华。全书按三部分来讲述COM:第一部分为COM基础,在写作这部分内容时,我参阅了“Inside COM”(《COM技术内幕》,已由清华大学出版社引进出版)一书,但重新调整了内容结构,并增加了一些关于Windows开发和Visual C++、MFC方面的知识;第二部分为COM扩展,在讲述这部分内容时,我参阅了“Inside OLE”一书,但因为此书主要是针对OLE讲述一些技术专题,所以我删去了一些不必要的内容,并补充了一些最新的资料;第三部分为COM应用与发展,这部分内容我主要参阅了Microsoft提供的技术资料,由于这些技术发展变化很快,所以我尽可能按照最新的版本讲述。
本书不仅介绍了COM的基本原理,也讲述了MTS以及COM+的一些知识,所以阅读本书可以了解到与COM相关的技术。本书的第三部分还介绍了组件化程序设计思想以及多层软件结构模型,这是目前计算机软件的一个发展方向。COM作为Windows平台上的组件对象模型,为组件化程序设计和多层软件结构提供了基础平台。因此,读者在学习了COM的基本原理之后,结合MTS和COM+所倡导的一些概念,就可以从更高的角度来理解COM和使用COM了。
Microsoft引用术语非常随意,这为本书的写作带来了很大的困难。COM技术涵盖面非常广,涉及到的术语又非常多,有大量的术语没有标准的中文说法,比如,“marshaling”、“moniker”、“apartment”等,对于这些术语,我都采用意译的方法,尽可能地把这些词在COM范畴中的真实含义表达出来,同时还能符合汉语的习惯。如果本书的这些术语表达欠妥,或者与其他书籍的译法有出入,还请读者见谅。
最后,我要感谢所有直接或间接为本书作出贡献的同事或朋友。首先,我要感谢我的妻子,没有她多年来对我的支持和理解,我很难写成这样一本技术专题书。其次,我要感谢北大计算机研究所和方正技术研究院的许多同事和朋友: 吕肖庆和邹维给了我很多帮助,他们的鼓励曾经使我克服了许多困难;杨巍使我转到COM的研究上来,并一直支持我从事相关技术的研究;孙杰、吕思伟、顾磷、王婷、赵绍君等几位研究生为我营造了很好的学习和使用COM的气氛,与他们的多次讨论使我受益匪浅。
我也要向微软(中国)有限公司的张伟伟先生表示谢意,他为我提供了一些最新的技术资料以及技术信息。最后,我要向清华大学出版社的汤斌浩先生表示感谢,与他的愉快合作使本书得以顺利出版。
引言1
第1部分COM原理
第1章概述9
1.1COM的起源9
1.1.1OLE的发展历史10
1.1.2组件的产生10
1.1.3面向对象的组件模型——COM11
1.2COM结构12
1.2.1对象与接口12
1.2.2客户 /服务器模型13
1.2.3COM库14
1.3COM特性15
1.3.1语言无关性15
1.3.2进程透明特性16
1.3.3可重用性17
1.4COM的发展前景17
1.4.1COM与Windows操作系统17
1.4.2COM与数据库18
1.4.3COM与Intranet应用19
1.4.4COM与Internet19
第2章COM对象和接口21
2.1COM对象21
2.1.1COM对象的标识——CLSID22
2.1.2COM对象与C++对象的比较23
2.2COM接口25
2.2.1从API到COM接口25
2.2.2接口定义和标识26
2.2.3用C++语言定义接口28
2.2.4接口描述语言IDL29
2.2.5接口的内存模型30
2.2.6接口的一些特点32
2.3IUnknown接口33
2.3.1引用计数34
2.3.2实现引用计数35
2.3.3使用引用计数规则39
2.3.4接口查询41
2.3.5COM对象的接口原则42
2.3.6QueryInterface成员函数的实现43
2.3.7COM对象和接口图示法45
2.4字典组件例子程序45
2.4.1组件程序DictComp46
2.4.2客户程序DictCtrl51
第3章COM的实现55
3.1进程内组件和进程外组件55
3.1.1进程内组件56
3.1.2进程外组件58
3.2通过注册表管理COM对象60
3.2.1注册表结构60
3.2.2COM组件注册信息61
3.2.3COM组件的注册操作63
3.3类厂(class factory)65
3.3.1类厂和DllGetObjectClass函数65
3.3.2COM库与类厂的交互66
3.3.3类厂的实现69
3.3.4类厂对组件生存期的控制73
3.4COM库74
3.4.1COM库的初始化74
3.4.2COM库的内存管理75
3.4.3组件程序的装载和卸载77
3.4.4常用函数和HRESULT79
3.5COM实现过程83
3.5.1进程内组件与客户的协作过程83
3.5.2进程外组件与客户的协作过程85
3.6字典组件例子程序的实现87
3.6.1字典组件类厂的实现87
3.6.2字典对象的实现87
3.6.3全局引出函数的实现88
3.6.4客户程序DictCtrl89
第4章COM特性92
4.1可重用性:包容和聚合92
4.1.1包容和聚合93
4.1.2包容实现95
4.1.3聚合实现99
4.1.4聚合例子程序108
4.2进程透明性110
4.2.1列集(marshaling)111
4.2.2自定义列集112
4.2.3标准列集116
4.2.4标准列集的实现121
4.2.5进程外组件例子程序125
4.3安全性126
4.3.1Windows NT安全机制127
4.3.2激活安全性128
4.3.3调用安全性131
4.4多线程特性132
4.4.1Win32线程和COM线程132
4.4.2列集和同步134
4.4.3套间线程135
4.4.4自由线程136
4.4.5进程内组件的线程模型137
第5章用Visual C++开发COM应用139
5.1Win32 SDK和MFC介绍139
5.1.1Win32 SDK140
5.1.2MFC基础:应用类和窗口类144
5.1.3MFC应用结构146
5.1.4MFC库结构148
5.2MFC对COM应用的支持149
5.2.1用嵌套类实现COM接口150
5.2.2接口映射表153
5.2.3CCmdTarget类实现IUnknown157
5.2.4COM引出函数和类厂实现159
5.2.5MFC对COM支持小结161
5.3用Visual C++开发COM应用161
5.3.1利用AppWizard创建COM程序工程框架162
5.3.2利用ClassWizard添加COM对象类164
5.3.3ATL介绍166
5.4Visual C++与ActiveX应用170
5.4.1MFC对自动化的支持170
5.4.2MFC对ActiveX控制的支持171
5.4.3MFC对复合文档的支持172
第2部分COM扩展
第6章可连接对象175
6.1可连接对象结构模型176
6.1.1客户与可连接对象的关系176
6.1.2可连接对象的基本结构177
6.1.3客户方基本结构178
6.2实现可连接对象(源对象)178
6.2.1枚举器179
6.2.2源对象和IConnectionPointContainer接口180
6.2.3连接点和IConnectionPoint接口180
6.2.4建立连接过程182
6.3客户\|源对象\|接收器的协作过程182
6.3.1接收器的实现183
6.3.2事件的激发和处理184
6.3.3与出接口有关的类型信息185
6.4可连接对象的程序实现186
6.4.1用IDispatch接口作为出接口187
6.4.2MFC对连接和事件的支持189
6.4.3用MFC实现源对象192
6.4.4用MFC在客户程序中实现接收器195
第7章结构化存储202
7.1结构化存储基础202
7.1.1从文件系统进展到结构化存储203
7.1.2存储对象和流对象205
7.1.3用结构化存储设计应用210
7.2结构化存储特性212
7.2.1访问模式212
7.2.2事务机制214
7.2.3命名规则216
7.2.4增量访问216
7.3结构化存储实现:复合文档217
7.3.1LockBytes对象和ILockBytes接口218
7.3.2复合文档API函数介绍219
7.3.3零内存保存特性和IRootStorage接口222
7.3.4存储对象、流对象和文件的CLSID信息222
7.3.5复合文档与结构化存储224
7.4永久对象实现224
7.4.1永久接口225
7.4.2永久对象的存储特性226
7.4.3永久对象例子程序228
7.4.4复合文档例子程序232
7.5本章小结238
第8章命名和绑定技术239
8.1名字技术基础239
8.1.1COM名字对象240
8.1.2使用名字对象:绑定过程240
8.2IMoniker接口242
8.2.1名字管理243
8.2.2利用IMoniker实现绑定244
8.2.3管理复合名字对象245
8.2.4名字解析246
8.3复合名字对象248
8.3.1复合名字对象结构248
8.3.2ROT和绑定环境对象249
8.3.3复合名字对象绑定过程的剖析253
8.3.4IOleItemContainer接口255
8.4COM名字对象分类257
8.4.1COM提供的系统名字对象257
8.4.2URL名字对象263
8.4.3自定义名字对象266
8.5COM名字对象的应用267
8.5.1服务程序中名字对象的应用268
8.5.2客户程序中名字对象的应用269
第9章统一数据传输272
9.1统一数据传输基础272
9.1.1数据交换与传输协议的分离272
9.1.2应用:剪贴板和拖\|放274
9.2数据传输机制275
9.2.1数据结构FORMATETC和STGMEDIUM275
9.2.2数据对象和IDataObject接口279
9.2.3通报连接机制282
9.2.4有关数据对象的小结285
9.3通过剪贴板传输数据287
9.3.1剪贴板协议机理和用法287
9.3.2MFC对剪贴板的支持290
9.3.3支持剪贴板操作的例子程序293
9.4拖\|放数据传输协议295
9.4.1OLE拖\|放传输协议296
9.4.2MFC对拖\|放特性的支持299
9.4.3支持拖\|放特性的例子程序300
第10章分布式COM(DCOM)302
10.1DCOM基本结构302
10.1.1从COM转向DCOM303
10.1.2DCOM对象的定位304
10.1.3列集(marshaling)305
10.1.4对象RPC306
10.1.5DCOM特性306
10.2对象激活308
10.2.1创建DCOM组件(一)308
10.2.2创建DCOM组件(二)310
10.2.3远程创建进程内组件:代理进程(surrogate)313
10.2.4如何连接到指定的远程对象实例314
10.3连接管理316
10.3.1更好地控制远程对象的生存期316
10.3.2pinging机制317
10.3.3连接点管理317
10.3.4连接传递318
10.4并发管理318
10.4.1线程模型319
10.4.2消息过滤器321
10.5DCOM安全模型325
10.5.1安全性策略325
10.5.2安全性配置327
10.6本章小结330
第3部分COM应用与发展
第11章自动化(Automation)对象333
11.1自动化对象基础333
11.1.1自动化产生与发展334
11.1.2属性和方法334
11.1.3类型库和ODL335
11.1.4IDispatch接口337
11.1.5自动化兼容的数据类型339
11.1.6参数顺序、可选参数和命名参数342
11.1.7IDispatchEx接口344
11.2自动化对象实现345
11.2.1类型库支持346
11.2.2Invoke函数实现350
11.2.3异常处理353
11.2.4多语种——本地化355
11.2.5用CreateStdDispatch函数实现自动化对象355
11.3自动化对象应用357
11.3.1双接口357
11.3.2迟绑定和早绑定359
11.3.3自动化集合对象360
11.3.4以IDispatch作为出接口361
11.3.5自动化控制器362
11.4自动化对象编程364
11.4.1MFC对自动化对象的支持364
11.4.2COleDispatchDriver类367
11.4.3在Visual Basic中使用自动化对象368
11.5例子程序370
11.5.1例子程序1——具有计算器功能的自动化对象370
11.5.2例子程序2——自动化客户程序371
11.5.3例子程序3——在Excel中使用计算器对象373
第12章ActiveX控制376
12.1ActiveX控制基础377
12.1.1实地激活377
12.1.2属性页380
12.1.3属性变化通知384
12.2ActiveX控制结构385
12.2.1ActiveX控制基本结构385
12.2.2包容器基本结构387
12.2.3IOleObject和IOleClientSite接口389
12.2.4IOleControl和IOleControlSite接口391
12.2.5用于ActiveX控制的标准分发ID394
12.2.6ActiveX控制的其他一些特点397
12.3ActiveX控制与Internet399
12.3.1从桌面环境转向Internet399
12.3.2包装ActiveX控制402
12.3.3许可证管理405
12.3.4Web页面中ActiveX控制的初始化407
12.3.5脚本支持与初始化安全性408
12.4ActiveX控制开发和应用409
12.4.1用MFC实现ActiveX控制——Smile例子程序410
12.4.2用MFC实现ActiveX控制包容器——Smiley例子程序412
第13章基于COM的程序设计415
13.1组件化程序设计415
13.1.1面向对象程序设计方法415
13.1.2组件的概念和特点417
13.1.3基于COM的组件化程序设计方法418
13.2MTS介绍420
13.2.1MTS基本结构420
13.2.2MTS程序设计概念422
13.2.3MTS管理程序424
13.2.4MTS特性426
13.3多层软件结构427
13.3.1应用结构的发展427
13.3.2多层应用软件结构429
13.3.3多层结构的优点432
13.4用COM设计Web应用433
13.4.1Web应用基本结构433
13.4.2ASP与COM组件434
13.5本章小结437
第14章COM发展——COM+439
14.1COM+基本介绍439
14.1.1Windows DNA策略440
14.1.2COM+基本结构441
14.1.3对象环境443
14.2COM+系统服务介绍444
14.2.1COM+队列组件445
14.2.2COM+事件模型446
14.2.3负载平衡447
14.2.4内存数据库(IMDB)448
14.2.5对其他服务的增强449
14.3COM+应用开发451
14.3.1应用开发支持451
14.3.2基于属性的C++编程语言452
14.4本章小结453
附录: 部分术语英汉对照表455