English

ATL之深入解析

2001-10-10 来源:中华读书报 潘爱民 我有话说

我写这篇文章的意图不仅仅是向读者介绍这本书,我也希望能够把我在阅读过程中的心得与大家分享。同时我还希望能够按照这本书的路线,向大家介绍一下ATL的结构和机理。

面对计算机图书市场的繁荣景象,我经常感叹今天学习计算机开发技术的同道们是多么幸运。十年前,我们学习计算机语言非常不容易,要掌握各种开发工具只有靠自己的摸索和极少量的参考手册。我记得,像1994年我学习Visual C++和MFC的时候,基本上只有靠软件自带的联机帮助;现在情形大不同了,书店中的计算机图书琳琅满目,关于Visual C++和MFC的书籍尤其多。有几位编辑朋友劝我写一点这方面的书,我觉得不大有必要了,因为Visual C++的好书已经不少了,适合各种读者层次的书籍几乎都可以买到,而且有一些书还相当不错。不过,在1998年的时候,我感觉关于COM书籍实在太少,几乎没有,于是我下定决心,自己写一本关于COM的书籍,在1999年底的时候由清华大学出版社出版。很快地,关于COM的书籍已经很多了,有些国外的名著也相继引入国内。从这十多年的计算机开发技术历史来看,一门技术只要有很多的书籍来介绍,那么这项技术很快就会普及,否则就难以推广。

说到COM,相信在Windows平台上有过开发经验的朋友一定接触过,它是Windows操作系统的基本软件模型,从1993年建立以来,为Windows平台的推广和发展做出了不可磨灭的贡献,而且其自身还在不断发展。但是要真正开发COM组件并不是很轻松,在Visual C++中,我们既可以使用MFC也可以使用ATL。MFC完全面向Windows应用,它用C++的封装技术建立了一套适合于开发Windows应用的C++类库,虽然在后期的版本中MFC提供了大量的COM支持,但是从基本的设计结构上讲,MFC不适合于开发专业的COM组件,它适合于在Windows应用的基础上提供相应的COM支持。

ATL则不同于MFC,它完全面向COM组件,其技术路线也不同于MFC,MFC使用的是C++中的继承、封装、嵌套等常规技术,而ATL使用了C++中模板、多继承等高级技术,甚至还用到了STL。所以学习和使用ATL要求我们必须熟悉这些C++高级特性。另一方面,ATL结构完全针对COM中的诸多规范,这就要求使用人员必须非常了解COM规范,才有可能真正把ATL用好。

虽然目前关于MFC的书籍很多,但是完全介绍ATL的书籍非常少,甚至根本没有,这不能不说是一个遗憾。我有幸在今年2月份看到一本ATL的英文原版书《ATLInternals》。本文将为大家介绍这本书。

在看这本书之前,我对ATL已经有了基本的了解,1998年底由于写作的需要,我曾经读过ATL的部分源码,对于ATL的基本结构还算清楚。我刚开始看到这本书的时候,快速读了一章,并没有感觉这本书有多好,后来由于工作忙碌的原因,一直没有得闲,直到最近,我才仔细把这本书读了一遍,感觉这是一本不可多得的好书。以前我很少仔细阅读开发技术类的书籍,一则是由于自己读书太慢,二则是往往开发技术类的书籍不太值得精读。但是这本书我读得很仔细,因为这本书把ATL的精华几乎全表述出来了,ATL中的许多内容都能让你为之心动,作为一个程序员,这也是一个学习和提高的机会。

我写这篇文章的意图不仅仅是向读者介绍这本书,我也希望能够把我在阅读过程中的心得与大家分享。同时我还希望能够按照这本书的路线,向大家介绍一下ATL的结构和机理。《ATLInternals》由Addison-Wesley出版社出版,作者为Brent Rector和Chris Sells,出版时间为1999年2月,全书600多页。关于这本书的背景知识可能对于许多COM迷和ATL迷来说很有意思。首先,这本书的序言是由ATL的发明人Jim Springfield所撰写,在序言中,Jim介绍了ATL的历史,对于书中所介绍的内容大加赞赏,称赞“阅读此书可以学到许多阅读源码所不能掌握的内容”,在序言的最后,Jim还谈到了ATL的将来。

其次,在作者写的自序中,他们提到了ATL离不开COM,要想掌握ATL,就一定要先掌握COM。ATL是一个产生C++/COM代码的框架,就如同C语言是一个产生汇编代码的框架,这个观点颇为新颖,仔细想来,确实如此。作者特别推荐了DonBox的书《Essential COM》,其实在英文书中,COM书籍不少,这显示出两位作者与DonBox的关系非同一般。我记得DonBox也曾经推荐过《ATLInternals》这本书,如果读者有机会到亚马逊网上书店(www.amazon.com)看看本书的书评就可以知道他们之间有很亲密的关系,其中作者之一ChrisSells与Don Box以及另外两人合作写了一本COM的书《Effective COM》(本书文中有多处推荐了这本书)。我相信他们的互荐是基于相互之间绝对了解的基础之上的,他们都是COM顶尖高手,也是ATL顶尖高手,读者经常可以在MSJ(Microsoft System Journal)杂志上看到他们的文章。

诚如作者所言,阅读此书需要极强的预备知识,按照我阅读此书之后的理解,读者在阅读此书之前应该有以下几方面的准备知识:

(1)一定要懂COM。ATL完全针对COM,许多细节都是为了更好地实现COM而设计。如果读者仅仅看过《Inside COM》(清华大学出版社出版的《COM技术内幕》),那么要想通篇阅读《ATLInternals》还不够,建议读者再找其他的资料看一看。

(2)一定要懂C++的模板技术。ATL充分发挥模板的优势,其整个体系结构完全建立在模板的基础之上,如果读者不熟悉模板,那么几乎无法阅读ATL。

(3)基本了解STL(可选)。ATL的集合类和枚举类用到了STL,当然,如果读者不懂STL,基本不影响全局的理解,但是STL中容器的思想和COM集合对象的思想是相通的,ATL把两者有机地统一起来了。

所以说,《ATLInternals》是一本起点很高的书,原因在于ATL是一门起点很高的技术。据我所知,现在有许多程序员已经在使用ATL了,这是好现象,说明我们国内的程序员水平相当高,虽然我们的资料信息还不够丰富(至少对于ATL而言是这样),但是我们仍然紧跟这些新的技术。尽管如此,要想真正用好ATL,一定要了解ATL的机理,这不同于MFC的情形。假如我们不懂MFC的机理,一样可以做出很好的程序,利用MFC,在不懂OLE细节的情况下,一样可以提供OLE的支持。ATL要求我们很细致地调节它的类,根据需要选择合适的模板类,必要时还要修正它的行为。ATL尽管已经到了3.0版本,但是仍然有不少的错误,这本书已经指出了一些错误,但我相信肯定还会有更多的错误,这对程序员提出了更高的要求,确实是这样,因此结论是:使用ATL一定要懂ATL!

尽管我这样说,但我还是认为ATL是一项好技术,是一个好的COM模板类库。而且我也深感好书对于ATL程序员的重要性,有些东西是不能从源码和参考手册获得的,既然我看到了这本好书,那我应该把这本书介绍出来,让大家知道这本书,也让大家分享我的体会。如果有哪家出版社能够引进这本书的话,则是我们广大ATL程序员的福音了。

另外值得一提的是原文的题目为“ATL之深入浅出”,实为不妥,因为这本书主要是深入,浅出的成分很少,所以改名为“ATL之深入解析”,这样也符合中文版的书名。(本书已经由中国电力出版社引进,潘爱民翻译)

手机光明网

光明网版权所有

光明日报社概况 | 关于光明网 | 报网动态 | 联系我们 | 法律声明 | 光明网邮箱 | 网站地图

光明网版权所有