您的位置:首页 > 其它

介绍几本COM的书籍

2010-07-23 09:28 183 查看

介绍几本COM的书籍

书籍 资料 2009-07-14 18:40:55 阅读31 评论0 字号:大中
http://www.xfbbs.com/Book/others/jishidaquan/8/7314.html
欲学COM之必读书籍---《COM技术内幕》
书名:《COM技术内幕》
英文原名:《Inside COM》
作者:(美)Dale Rogerson
Microsoft Press 1997
中文译者:杨秀章
清华大学出版社 1999年3月第1版
定价:50.00元(带光盘)

Microsoft Press的《Inside ……》(翻译成中文就是《……技术内幕》)系列书籍似乎总保持着独
到的权威性,很少让人失望。从《Inside OLE》到《Inside Visual C++》,都十分受到读者的欢迎,
名声极好。《Inside Visual C++》称的上是深入浅出的典范,大师的语言以及清楚的思路都让人收益
非浅。但是可能是由于名字的原因,很多想学Visual C++的人面对这本厚厚的大作的时候,多少总有些
胆怯,担心自己看不懂。少勇认为,只要你具有了一些C++的基本知识(有WIN32的概念更好),学这本
书就不难,当然毅力是克服困难的秘方。

《Inside COM》也称的上是一本难得的上乘之作,这本书的最大特点在于语言轻松、循序渐进,在选
材和结构组织上不难看出作者着实是煞费了一番苦心。为了把“门槛”设得低一些,作者在前几章尽可
能地回避了很多诸如类厂、注册表等难点和细节问题,集中“优势兵力逐个歼灭敌人”,我不知道
Dale Rogerson先生是不是从朝鲜战争中彭总司令的指挥艺术中得到的启示。在示例程序的安排上,每
章都有一到两个独立于其他章节的程序,而且作者尽量使这些程序简短而完整。一方面短的例子阅读起
来比较容易,另一方面读者可以将学习的重点放在COM组件的需求上,而无需费力去搞清楚复杂的例子中
的那些不必要的细节及复杂的实际问题。于编程语言,作者采用的是传统的C++语言,没有涉及到任何
WIN32以及MFC的知识,除了在第九章中用到了一些方便的接口指针类之外,书中的其他部分都没有用到
模板类。总之作者尽可能地抛掉了一切累赘使读者能轻装前进,只要你学过标准C++,有面向对象编程的
基本概念(封装性、继承性、多态性),就大可放心地读这本书了。

书的前五章讲的很明白,都是一些诸如组件、接口、引用计数、接口查询以及DLL等基本概念,无需少
勇多费口舌。稍微有点美中不足的是书里边建立程序时都用如下命令:
“cl Client1.cpp Create.cpp GUIDS.cpp UUID.lib”
“cl/LD Cmpnt1.cpp GUIDS.cpp UUID.lib Compnt1.def”以及
“nmake –f makefile”。

问题是,现在有多少人能够很熟练地写makefile文件以及运用nmake和cl命令?恐怕很少吧。于是读者
就得花很多时间来琢磨程序的编译过程,费时、费事、不打粮食!

当然,作为原理性的论述,这些东西还是要讲,但是至少应该告诉读者该如何操作才对。我拿第五章的
例子来说,首先是建立组件DLL:由于有了VC++,我们大可不必用“cl/LD”来做了,只需要编辑好
CMPNT1.CPP、CMPNT1.DEF以及IFACE.H、GUIDS.CPP后,在VC++的集成环境中选择建立一个空的
WIN32 DLL工程,把这四个文件加入工程,编译连接后CMPNT1.DLL就生成了。然后是建立客户程序:
很多人往往这样做:先建立一个空的WIN32工程文件,然后把编辑好的标准C++文件加入工程,可是却
通不过连接。

于是不止一次的有人问我:在VC++下如何建立标准C++的工程?
(1)、随便写一个标准C的程序,越简单越好,如:
main(){return 1;}
把这个文件存入你希望的目录下,一定要与你想建的工程同名。(如果你希望的工名是APPLE,那么你
应该把这个文件存为APPLE.CPP)。
(2)、编译APPLE.CPP,这时VC++会提示你没有建工程,是否需要他为你缺省地建一个,当然
“是”。于是VC++就在存有APPLE.CPP的目录下创建了名字为APPLE的工程。
(3)、下一着就是“过河拆桥”,从工程里删除APPLE.CPP,加入或者编辑你希望的文件即可。

书的前六章讲的很明白,都是一些诸如组件、接口、引用计数、接口查询以及DLL、HRESULT、GUID、
注册表等基本概念,大体上过得去,无需少勇多费口舌。

第七章讲述类厂,利用类厂来创建组件可能会让人迷惑:不用类厂,一样可以写出功能同样强大的组
件来,为什么还要多此一举呢?少勇认为,如果您只想写一个进程内的组件,那么这句话一点没错,
因为您完全可以写一个全局函数来创建所有的组件,这时,我们丝毫看不出类厂有什么存在的必要性。
但是,如果您要跨进程来创建组件,则情况就不同了:您能写出在其他进程中创建组件并返回句柄的
“全局函数”来吗?于是乎Microsoft就想出了创建一个特殊的组件,用这个特殊组件来创建其他的
组件,这个特殊组件就是类厂。在进程外组件的创建过程中,类厂接口IClassFactory是第一个跨进
程的连接。

第八章是至关重要的一章,讲述了组件的复用:包容和聚合。关于“COM是不是面向对象的”之类的
讨论好象一直在进行着。COM曾经被指责是一项很差的技术,原因是COM不支持传统意义上的“继承”。
这里我们得这样来看这个问题:组件具有“可独立发布特性”和“二进制特性”,既然可独立发布,
就不应该依赖于某个基类,否则如果基类变了,那么组件也得跟着做变动,可独立发布也就无从谈
起。而组件复用又是一个现实存在的问题,因为用现成的组件实现新组件的某些功能可以节约大量的
时间,COM利用包容和聚合实现了组件的复用,这样既维护了组件的“可独立发布特性”,又变相实
现了“继承”。嘻嘻!把“猫”叫了个“咪”。少勇认为,关于一些无碍全局的争吵越少越好,衡量
一个技术好坏的标准是看它是不是确实好用,能不能解决我们的问题。

关于本章的示例程序作一点说明:

细心的读者可能都会提出这样的问题:在Cmpnt1.cpp的CA::Init()函数中有这么一句:
hr=m_pUnknownInner->QueryInterface(IID_IY,(void**)&m_pIY);
通过这句话,外部组件CA将得到指向内部组件IY接口的指针。但是问题就此产生了,是不是应该调
用NondelegatingQueryInterface呢?种种迹象看来都应该是的,因为我们这里要得到非代理未知
接口的指针。如果调用了代理未知接口的查询函数,情况会怎么样呢?代理未知接口又把请求转发
给外部组件,而外部组件又把请求推回给内部组件,形成了死循环。但是运行一下例子程序,发现
死循环并没有出现,一切正常!为什么?仔细一看方突然醒悟:追究一下m_pUnknownInner指针的
由来,发现它是指向内部组件的非代理未知接口的,也就是说这里调用的实际上就是
NondelegatingQueryInterface,当然不会出错(这也是面向对象多态性的一个体现)。

第九章除了智能指针之外,基本上没有新概念的提出(实际上智能指针也不是什么新东西,
Visual C++本身就支持智能指针)。至于CUnknown和CFactory,只要前八章您切实看懂了,理解
它们不是什么难事。

至于接下来的三章……呃……据说此书一出,从读者反馈的意见来看,对后几章批评颇多。少勇的
观点如下:首先成绩是主要的,因为COM的跨进程调用的确很复杂,少勇也是花了九牛二虎之力才
“拨云见日”,能讲成这个样子已经很不容易了。但是读者对书有意见主要是因为没有看懂,他们
希望的是把一个复杂的知识用最通俗的语言讲出来,而且要严密。因此,这几章的语句和概念需要
斟酌处还是很多,对于DCOM的论述应该加强(但是这确实会有一定难度)。

书的最后提供了一个七巧板的例子,有兴趣的读者可以研究一下,玩一玩,辛苦了半天,也该轻松
片刻了。

书的结束语中写到:“在理解了本书介绍的所有内容之后,读者应该可以算得上是一个COM专家了”。
但少勇以为,此言尚为时过早,如果把COM的知识比做一个“大树模型”,那么本书只是解决了最
基本的问题,也就是大树的第一个树杈之下的主体部分。如果说完全了解COM,那么还应该了解COM
这棵大树的每一个树枝、每一片树叶以及树叶上的虫子。

此书值得一看---《COM/DCOM编程指南》
书名:《COM/DCOM编程指南》
英文原名:《COM/DCOM Primer Plus》
作者:(美)Corry, Mayfield, Cadman
Sams Publishing 1999
中文译者:刘云 孔雷
清华大学出版社 2000年1月第1版
定价:52.00元(带光盘)

SAMS出版的书以它独到的视角占领着市场,在读者中名声还挺不错。看他们的书可能是一条快速入门
的捷径。在现在COM书籍非常短缺的时候,《COM/DCOM编程指南》称得上是一本值得一看的书。少勇
对此书的评价是:关于原理的论述中规中矩,无明显的破绽,而且对相关知识的涉及颇广,语言也还
算流畅,倒也十分难得,只可惜火候尚欠,不够深入,因此,称不上是一本“COM专著”。读完此书,
少勇闭目细品,就好象在满怀希望地吃了一顿大餐之后却没有哪道菜是上档次的“大厨手艺”,不免
觉得有些美中不足。不过,从实用的角度来看,此书却也称得上是上乘之作了,不光给出了完整的例
子,在第十章还给出了DCOMCNFG的配置示例,实为难得。读者如果把这本书和其他的一些书搭配着看,
《指南》当之无愧是一个优秀的“二传手”(看得出译者在为本书取名字的时候确实花了一番心思,
倒也十分得体)。

SAMS公司的书的一贯风格是门槛较底,学起来基本没有什么痛苦。但COM却是一种比较高级的技术,
“零痛苦”的学习似乎不太可能,而且SAMS总是力求实用,于是免不了举一些实际的例子,因此所涉
及的知识就比较多了。如果您对C++、事件驱动编程以及MFC还不够了解的话,则应该在阅读此书之前
先去看一些相关知识的书籍。

书中关于接口定义语言(IDL)的论述可以算是一个闪光点。IDL最初并不是设计为描述COM类和接口
的一种方法,而是开放软件基金会为分布式计算环境(DCE)规定的RPC IDL。微软最初把IDL设想为
描述可用于Windows NT机器间通信的RPC接口的一种方法,后来逐步加入了许多专用于COM组件的关
键字,用来描述COM接口以及COM对象。

谈到IDL和ODL,可能不少读者会感到很迷惑。不过没办法,这是一个历史遗留问题,书中第170页的
论述相信会给您一个满意的答复。

美国人写书,喜欢把一些背景文化写进去,少勇非常赞赏。比如这本书中提到了“COM的生活方式”,
着实让人眼睛一亮、精神为之一震。Don Box 是一位COM领域泰斗级的人物,在MSDN 中时常能见到
他的大作,他所说的“COM的生活方式”实际上是在区别COM编程与传统的C++程序开发的不同以及在
软件工程上的改变。

书中有如下评论:
“强烈建议你以IDL开始所有的编程工作,不要将IDL仅仅用于生成本地服务器的代理和占位模块。
正象Don Box曾经说过的,‘真正的COM程序员用IDL开始工作’”。

虽然少勇对大师非常尊重,但还是认为此言过于绝对化和偏激了。因为Don Box所讲的实际上是一种
理想化的软件开发方式,我们基本遇不到。按照Don Box的理论,如果我们开发一个工程,全部运用
COM组件,那么在开始编程之前应该设计好所有的接口,由于接口的不变性,设计好之后就不应该改
变了,因此也就应该从IDL开始所有的工作了。回到现实中来,我们的程序员在做一个产品的时候,
一般都先构造一个程序框架,组件只是完成一些基本功能,不是工程的全部,于是大师的言论在此并
不适合我们。

许多人认为,“在软件上,美国的今天就是我们的明天”,于是纷纷把美国人的发明、理论拿来当作
圣经来读。但少勇说:“借鉴的同时还要有选择、有思考,看它是不是切实符合中国的国情。”

书的最后一章利用前面讲述的内容创建了一个真正的分布式应用的例子,建议读者仔细研读一下(包
括本书中的其他程序),要勇于去吃螃蟹。否则就算少勇抹一抹嘴边的油,告诉您说螃蟹是何等的美
味,可能信的人也不多。

强力推荐!COM的“宝典专著”---《COM原理与应用》
书名:《COM原理与应用》
作者:潘爱民
清华大学出版社 1999年11月第1版
定价:39.00元

朴素无华的外表、平淡无奇的名字、几乎白送的价格是少勇对这本书的第一感觉。但翻开此书,

简单地浏览之后,少勇顿时“心跳加速、浑身来电”,揉了揉眼睛,大有一种捡了金子的喜悦。
于是一章一章细细品来,越看越起劲,越读越过瘾,不禁惊呼:“此书乃COM之宝典专著也”!少勇
认为,本书具有“系统性、严密性、深入性、实用性”四大特点。“系统性”是说此书所论述的知
识涉及到了COM领域的各个方面,不仅全面、而且系统。看的出潘爱民先生的功底之深厚决非常人所
能及,他不仅对COM有着深入的研究,而且对C++的理解也堪称炉火纯青(作者翻译了《Visual C++
技术内幕》[第四版]),因此讲起来条理清晰、错落有致、自成体系,有如滔滔长江之水接海连天,
使人心旷神怡、流连忘返。“严密性”是说书中的语句措辞颇为讲究,经得起推敲。有些地方初看
似有不妥之嫌疑,但仔细一品,才发现其中的奥妙,只是自己以前没有理解得如此深刻而已。“深
入性”是说此书并不是一本泛泛而谈的书,许多章节的论述都堪称精辟、给人以耳目一新的感觉,
乃大师力作。由于作者的功力深厚,因此理论与实践的结合可谓“无缝”,因此“实用性”也是本
书的一大特点。

全书分为三个部分,第一部分包括前五章,讲述COM的原理。少勇认为,如果几个秀才作同样题目的
命题作文,很容易就能看出水平的高低来。关于如组件、接口、DLL以及跨进程调用等最基本的概念
可能所有讲COM的书上都会讲,但深浅不一。在本书中,作者不仅讲述了基本理论,还对其进行了润
色、加工,许多地方还作了总结,很有条理地向读者说个“一、二、三”。与现在很多人把英文资料
拿来拼拼凑凑就可以“堆”出一本书相比,作者的做法实在难能可贵。

第四章讲述了客户程序创建COM对象的进程透明性。大家知道,不管是进程内组件还是进程外组件,
客户程序可以用一致的方法创建COM对象。对于进程内组件,无论是创建过程,还是对接口函数的调
用过程,我们都可以按照一般的同一进程内部函数调用的过程来理解组件和客户之间交互操作;但对
于进程外组件,实际的情形要复杂的多,因为组件程序和客户程序拥有不同的进程空间,所以,它们
之间所有的交互过程都涉及到进程之间的通信过程。

虽然客户程序和对象在不同的进程空间中,但所有对接口的调用都是间接进行的,客户程序调用接口
成员函数就如调用本进程内的函数一样,这正是COM所达到的透明效果。

在这一节里,作者不仅介绍了组件进程和客户进程的内存模型,还对接口调用过程中的列集
(marshaling)处理过程作了详细的论述,并且给出了实现自定义接口的标准列集程序的过程,最后
还以例子说明了进程外组件自定义接口的实现过程。

少勇认为,这一部分的论述不光深入,而且极具条理性。以类厂对象的列集过程为例,书中有如下论述:
(1)、首先确定注册对象(即类厂对象)提供的代理对象的CLSID,如果注册对象不能提供代理对
象的CLSID,则使用标准的列集代理对象。然后CoRegisterClassObject函数要求注册对象提供列集数
据包,实际上是一个字节流,它包含了用于代理对象与组件对象的跨进程连接所必需的信息。如果注册
对象不能提供这样的数据包,则使用COM提供的标准列集数据包。
(2)、COM把代理对象的CLSID和列集数据包传输到客户进程中,CoGetClassObject函数正在等待
这些数据。
(3)、在客户进程中,COM根据传输过来的CLSID创建代理对象,并且把列集数据包传给代理对象。
因为,列集数据包包含了代理对象与组件对象的连接信息,所以代理对象利用数据包建立与组件的连接。

象这样总结性的论述几乎遍布了书的每一个章节。能作到这一点本以非常难得,但作者并没有就此收笔,
他还详细介绍了IMarshal接口,并给出了自定义列集的实现。象这样的知识,您在其他书中恐怕找不到
吧。

第五章,“用Visual C++开发COM应用”主要从两个方面进行了论述,一个是MFC,一个是ATL。由于作
者在Visual C++方面的造诣,因此这一部分中对于MFC的论述可以称的上在同类书中首屈一指。我这么
说是因为一般书籍在讲到这里时,对用MFC实现COM接口的机制往往都有所涉及,但大多论述不够,长久
以来,少勇总有一种“走出餐馆却没有吃饱”的感觉,不免遗憾。但是这一点本书却做到了,通过对
DECLARE_INTERFACE_MAP()、BEGIN_INTERFACE_MAP、END_INTERFACE_MAP、INTERFACE_PART、
INIT_INTERFACE_PART等宏的深入剖析,使读者能对MFC如何实现COM接口、如何定义接口映射表有一个
全面的认识。如果您需要用MFC来编写COM组件的话,相信一定会从受益非浅。接下来对于ATL的论述略
显单薄,但所讲内容都是精华,具有较高的参考价值。少勇认为,在ATL日益受到重视的今天,市场上
尚缺少一本系统讲述ATL的书籍,但不知哪位“大侠”有心情填补此缺。

书的第二部分是六到十章,讲述了COM规范中扩展的一些内容,包括可连接对象通信机制、结构化存储
技术、COM对象的名字对象技术、统一传输机制以及DCOM。如果读者要全面理解COM,这部分内容为您
提供了这些技术的细节。以前,很少有书能够如此系统地介绍这些技术,就算偶尔有书涉及一二,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: