介绍几本COM的书籍
-- 韩少勇最有效的获取知识的途径就是读书,当然要读好书。难怪古人把求学也称作“念书”。 
引言实际上,写一些介绍电脑图书的文章是我长久以来的愿望。一方面由于我的朋友们经常让我为他们推荐
一些切实有用的书,另一方面的原因是我在早些时候的学习并不很顺利,面对书店里鱼龙混杂的
“繁华”,真是不知所措。结果横下心来,只要觉得差不多,就买!结果买了很多本不必买的书,浪费
了钱财、浪费了时间。数年下来,倒也对电脑图书市场有了一些看法,产生了一些感慨。大多数世人都不是圣贤,因此往往听得赞美,对批评却很难接受。我的许多朋友担心我的安全,劝我多
说好话。可是书有好有劣,说假话当然有违初衷,说真话又难免得罪人。于是我们共商了一个“安全政
策”:以“扬善”为主,在详细地介绍了一本好书之后就算提了几点不足,我想作者和出版社还是会接
受的吧。至于一些不负责任的出版,我只说现象,不提名字。(请大家理解,浮生在世,安全第一、安
全第一。)目前IT行业竞争激烈,市场风云变换莫测,为了生存,所有人都超负荷地承受着各方面的压力。当程序员
或者经理们好不容易从一大堆烦琐的事务中探出头来,拿起一本向往已久的专业书籍来充实自己的时候,
他们当然希望尽快的把书上的东西转化为自己的思想,从而利用这宝贵而短暂的缓冲期学到更多的东西。但可惜的是有些书却不是为了这个目的来写的,书上的话象文言文一样难懂(也许有些作者觉得只有这样
才能显示出他的水平深不可测,也许有些作者压根儿就没有理解所讲的内容,只好用一大堆云山雾绕的语
言来“遮羞”)。不仅如此,还有更可怕的现象,当电脑图书开始呈现出强劲的销售势头的时候,无数
的“专家”、“大师”就在一夜之间涌现了出来,各种名字“大气磅礴”的书籍、培训让人目不暇接,
就象大街上穿梭不息的出租车一样多。且不说他们的水平究竟如何,我想,“多必滥”似乎是一个曾被
验证了许多次的道理。我就在北京某大学的布告栏里看到了“Internet培训”的宣传,实在让人哭笑不
得。现在,形形色色的电脑培训班已经成为了“IT文化的一大风景”。对于这种现象,外国人的评论似乎更
能发人深省:“在美国,是没有这么多培训班的,但是一个小学生都可以熟练地操作电脑。”“在中国,
电脑培训班到处都是,但计算机技术的普及却仍然是一个问题。”“中国的自行车很多,男女老幼都会
骑,但是你见到过自行车培训班吗?如果到处都是自行车培训班,在不厌其烦地教你‘自行车的轮子直
径多长、有多少根辐条’等等问题,那么相信会骑自行车的人会越来越少。”写书或者译书也是如此,
电脑图书的空前繁荣是否表示我们的水平很高呢?我认为不然。有时为了解决个别问题去书店找找资料,
结果往往是浪费了时间还徒留“天下文章一大抄”的感慨。题材和形式都很雷同的书籍的大量充斥市场,
我称之为“爆米花现象”。典故是这样的:前些年,我家门前的大街上来了一家爆米花的,因为独此一
家,所以生意红红火火。可是没过多久,又雨后春笋般地涌现了十几家,沿着大街一字排开,煞是壮观。
现在大家的生意均不太好,但谁都没有意见,只是我家常年“米花飘香”。如果说中国人“跟风”的脾
性是祖宗传下来的,因循守旧者把它奉若神明的话,我们的电脑作者们是否应该具有一些开创精神,静
下心来想一想,市场上究竟缺些什么书,不要一味地“人云亦云”。虽然好为人师者比比皆是,但是老师却不是那么好当的,因为你得对所讲述的知识有深刻的理解,并能
够用深入浅出的语言来讲给别人听。态度当然是第一位的,但是书的神圣却被不少作者和出版社践踏着。
一些出版社不顾质量,一味求出书快,结果商机有了,却倒了牌子。一本原先很不错的英文书被他们翻
译得驴头不对马嘴,根本不能看。而由于版权卖给了他们,其他出版社有心重翻也无能为力了。一本好
书甚至一套好书就此被糟蹋,而利益受损的当然是读者。除了态度,还要有水平,书不是随便一个人都
可以写出来的。时下里许多书的名字起的要多吓人有多吓人,总是让我想起了街边卖大力丸的:“只要
吃了我的药,就刀枪不入、百毒不侵”。可事实上许多作者本身功力薄弱, 写不出架构与精神,于是
入门书籍千篇一律就是教大家按下菜单,选择命令, 出现对话框,按下‘确定’ ...”。 真正的老
师不好找,但“二把刀师傅”却到处都是(就象现在一天到晚占着电视频道的歌星、影星一样让人眼花
缭乱)。加上某些出版社把关不严,这才造成了是个人就可以出书的现象。今天,我为大家介绍几本COM的书籍,希望能在COM的学习上助君一臂之力。欲学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利用包容和聚合实现了组件的复用,这样既维护了组件的“可独立发布特性”,又变相实
现了“继承”。嘻嘻!把“猫”叫了个“咪

解决方案 »

  1.   


    强力推荐!COM的“宝典专著”---《COM原理与应用》
    书名:《COM原理与应用》
    作者:潘爱民
    清华大学出版社 1999年11月第1版
    定价:39.00元朴素无华的外表、平淡无奇的名字、几乎白送的价格是少勇对这本书的第一感觉。但翻开此书,简单地浏览之后,少勇顿时“心跳加速、浑身来电”,揉了揉眼睛,大有一种捡了金子的喜悦。于是一章一章细细品来,越看越起劲,越读越过瘾,不禁惊呼:“此书乃COM之宝典专著也”!少勇认为,本书具有“系统性、严密性、深入性、实用性”四大特点。“系统性”是说此书所论述的知识涉及到了COM领域的各个方面,不仅全面、而且系统。看的出潘爱民先生的功底之深厚决非常人所能及,他不仅对COM有着深入的研究,而且对C++的理解也堪称炉火纯青(作者翻译了Visual C++技术内幕》[第四版]),因此讲起来条理清晰、错落有致、自成体系,有如滔滔长江之水接海连天,使人心旷神怡、流连忘返。“严密性”是说书中的语句措辞颇为讲究,经得起推敲。有些地方初看似有不妥之嫌疑,但仔细一品,才发现其中的奥妙,只是自己以前没有理解得如此深刻而已。“深入性”是说此书并不是一本泛泛而谈的书,许多章节的论述都堪称精辟、给人以耳目一新的感觉,
    乃大师力作。由于作者的功力深厚,因此理论与实践的结合可谓“无缝”,因此“实用性”也是本书的一大特点。全书分为三个部分,第一部分包括前五章,讲述COM的原理。少勇认为,如果几个秀才作同样题目的命题作文,很容易就能看出水平的高低来。关于如组件、接口、DLL以及跨进程调用等最基本的概念可能所有讲COM的书上都会讲,但深浅不一。在本书中,作者不仅讲述了基本理论,还对其进行了润色、加工,许多地方还作了总结,很有条理地向读者说个“一、二、三”。与现在很多人把英文资料拿来拼拼凑凑就可以“堆”出一本书相比,作者的做法实在难能可贵。
    第四章讲述了客户程序创建COM对象的进程透明性。大家知道,不管是进程内组件还是进程外组件,客户程序可以用一致的方法创建COM对象。对于进程内组件,无论是创建过程,还是对接口函数的调用过程,我们都可以按照一般的同一进程内部函数调用的过程来理解组件和客户之间交互操作;但对于进程外组件,实际的情形要复杂的多,因为组件程序和客户程序拥有不同的进程空间,所以,它们之间所有的交互过程都涉及到进程之间的通信过程。虽然客户程序和对象在不同的进程空间中,但所有对接口的调用都是间接进行的,客户程序调用接口成员函数就如调用本进程内的函数一样,这正是COM所达到的透明效果。
    在这一节里,作者不仅介绍了组件进程和客户进程的内存模型,还对接口调用过程中的列集(marshaling)处理过程作了详细的论述,并且给出了实现自定义接口的标准列集程序的过程,最后还以例子说明了进程外组件自定义接口的实现过程。少勇认为,这一部分的论述不光深入,而且极具条理性。以类厂对象的列集过程为例,书中有如下论述:
    (1)、首先确定注册对象(即类厂对象)提供的代理对象的CLSID,如果注册对象不能提供代理对象的CLSID,则使用标准的列集代理对象。然后RegisterClassObject函数要求注册对象提供列集数据包,实际上是一个字节流,它包含了用于代理对象与组件对象的跨进程连接所必需的信息。如果注册对象不能提供这样的数据包,则使用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、TERFACE_PART、INIT_INTERFACE_PART等宏的深入剖析,使读者能对MFC如何实现COM接口、如何定义接口映射表有一个全面的认识。如果您需要用MFC来编写COM组件的话,相信一定会从受益非浅。接下来对于ATL的论述略显单薄,但所讲内容都是精华,具有较高的参考价值。少勇认为,在ATL日益受到重视的今天,市场上尚缺少一本系统讲述ATL的书籍,但不知哪位“大侠”有心情填补此缺。
    书的第二部分是六到十章,讲述了COM规范中扩展的一些内容,包括可连接对象通信机制、结构化存储技术、COM对象的名字对象技术、统一传输机制以及DCOM。如果读者要全面理解COM,这部分内容为您提供了这些技术的细节。以前,很少有书能够如此系统地介绍这些技术,就算偶尔有书涉及一二,也都不很深入。而且这部分知识涉及到了COM应用中的许多实际问题,比如说OLE,虽然已经诞生很多年了,但大多数人对它还是一知半解、掌握得很不够。虽说从各种媒体上您可以找到许多资,但把这些资料整理出来系统地讲述,并不多见。纵观这几章的论述,可以看出作者一定认真研究过COM体系结构以及OLE的许多内部资料和源码,并通过自己的加工把这些原本支离破碎而且难懂的材料做成了一顿“美味大餐”。“难得,难得,”少勇看完这几章,不禁赞不绝口,“集大成者也!”(实际上,这里的每一个话题少勇都有一大堆感想要与您分享,只可惜篇幅所限,只能把最精彩的部分拿出来介,欲知详情,还是买一本回家慢慢看吧。)DCOM是不得不说的,它是COM从桌面环境走向分布式网络环境的必然。从COM逐渐过度到DCOM,这部分堪称“深入浅出”的典范,不仅详细介绍了DCOM的原理和特点、用户如何创建DCOM组件,还对连接管理、并发管理作了详细的论述。记得我在评《COM技术内幕》时讲过其最后几章不太令人满意吗?那么看潘爱民先生的书会弥补您的缺憾。
    在第二部分,我的最后一个话题是关于安全性的,因为对于一个分布式系统来说,这太重要了。《COM原理与应用》在两个地方对安全性进行了论述,第一次是在第四章,提到了激活安全性和调用安全性。
    这里从COM特性的角度讲述了COM安全性,侧重于安全模型结构。第二次是在第十章,提到了访问安全性和激发安全性,侧重于DCOM在分布式环境下的安全模型的配置情况,强调实用性。到此,有些读者可能就会觉得这四个“安全性”混在一起,磕磕碰碰、搅搅拌拌、倒是一盘好菜,只可惜看不明白。少勇认为,这只是因为目前COM领域名词太多、叫法又十分混乱,Microsoft尚是如此,何况他人?因此,这
    对于写书的人来说,确实很难办。于是有些作者采取了回避的政策,讲激活安全性和调用安全性就不讲访问安全性和激发安全性,而如果要讲访问安全性和激发安全性则对激活安全性和调用安全性只字不提。
    这样虽然解了一时之困,但不利于读者建立一个完整的概念。《COM原理与应用》并没有回避困难,其“深入性”又一次得到了体现。看得出来,在写这部分的时候,作者也下了一番工夫,他以不同的角度对COM安全性作了有层次、有重点的论述,我认为其可贵之处有二:其一,COM的资料本十分难找,关于安全性的材料就更少了,能搜集到比较系统的资料实在不容易;其二,关于这部分知识以前基本没有权
    威性论述,全凭写书的人自己领悟,这就要求作者具有很好的功底和悟性,当然还得经过艰苦的努力。
    说实话,书的这部分少勇反反复复看了数遍,确实学会了很多知识。我的建议是,在阅读这部分时,切记要细致但不要钻牛角尖,否则可能一时半会儿真的就绕在里边出不来。还有,由于DCOM的安全性是建立在NT安全性基础之上的,很多地方涉及到了分布式系统的安全策略,因此您最好具有这方面的基础知识,如果没有,看不懂是很正常的事。
    通过对本书的前两部分的学习,您已经对COM的基本原理和扩展部分有了一个比较全面的认识,就象盖房子,您已经打好了坚实的地基并垒起了围墙,实在可喜可贺!但这还很不够,因为我们学一项技术的目的就是如何来很好地用它。因此,就必须进行第三部分的学习,在这里您将学到既具有COM优点又实用的技术,作者将教您如何给房子盖上房顶。书的第十一章讲述了自动化对象。自动化的概念最早出现在OLE2中,当时叫做OLE自动化。后来这个概念被COM所吸收,称为自动化。现在各式各样的Control中都引入了自动化的概念,Word和Execl也支持自动化。事情往往就是这样,一个概念应用的越广就越难给其下一个恰到好处的定义。自动化便是这样,各种资料上形形色色的描述总是让人抓不住重点。《Inside COM》中关于自动化的论述也很不能让人满意,而《COM原理与应用》算是弥补了这方面的缺憾。我们知道,COM实质上是定义了一种客户与服务器的通信方式,而这种通信是通过接口来完成的。当我们用C++来写客户程序的时候,一切都是那么美好,通过CoCreateInstance和QueryInterface将得到一个接口指针,通过这个接口指针就可以调用相应的函数了。请注意,这一切都是通过指针来进行的。可是当我们用Visual Basic写客户程序时,情况就不那么美好了,原因只有一个:Visual Basic是弱类型编程语言,它对数据类型的描述能力非常有限。因此,我们必须提出一个让解释性语言也能够访问组件的方案,这个方案就被称之为自动化。一个自动化服务器实际上就是一个实现了IDispatch接口的COM组件,而一个自动化控制器则是一个通过IDispatch接口同自动化服务器进行通信的COM客户。在本章中,作者对IDispatch接口和相关数据类型、Invoke函数的实现、双接口以及迟绑定和早绑定、自动化对象的编程都