::首页 >> 文档中心 >> 在线杂志 >> ATL [ 在线杂志 第13期 ]


[ 原创文档 本文适合高级读者 已阅读48757次 ]

用ATL建立轻量级的COM对象

第一部分

作者:赵湘宁

本文假设你熟悉C++和COM。

摘要:
    ATL——活动模板库(The Active Template Library),其设计旨在让人们用C++方便灵活地开发COM对象。ATL本身相当小巧灵活,这是它最大的优点。用它可以创建轻量级的,自包含的,可复用的二进制代码,不用任何附加的运行时DLLs支持。
    由于COM技术良好的口碑,越来越多的程序员已经走进或正在走进COM的编程世界。它就像盛夏里的冰镇啤酒,从来不会让你失望。可惜作为一个C++程序员来说,C++从不与我分享COM的极致以及我对COM的情有独钟。
    C++与COM之间若即若离,和平共处,一次又一次在每个对象中用同样简洁的几行代码实现IUnknown。我敢肯定将来C++编译器和链接器会实现C++对象和COM对象之间自然 的无意识的对应和映射,目前这个环境只存在于实验室中,因此它肯定不是一个你我今天可以购买的产品。眼下可得到的最接近这个环境的东西就是活动模板库——ATL。

为什么使用ATL?
   
ATL是在单层(single-tier)应用逐渐过时,分布式应用逐渐成为主流这样一个环境中诞生的, 它最初的版本是在四个C++头文件中,其中有一个还是空的。它所形成的出色的构架专门用于开发现代分布式应用所需的轻量级COM组件。作为一个模块化的标准组件,ATL不像MFC有厚重的基础结构,省时好用的库使得成百上千的程序员一次又一次轻松实现IUnknown 和IClassFactory。
    ATL的构架并不打算包罗万象,无所不能。其第一个版本对实现IUnknown,IClassFactory,IDispatch,IconnectionPointContainer及COM枚举提供非常 到位的支持。第二个版本除了可以编写ActiveX控件外,还对最初的第一个版本中ATL类进行了增强。ATL不提供集合(collections)和串(strings)的处理 ,它假设你用标准的C++库进行这些处理;不支持ODBC——这个世界正在转移到基于COM的不需要包装的数据存取方式;不支持WinSock打包类--sockets本身也是新的东西;ATL也不支持完整的Win32 API打包类——ATL2.0的实现机制提供了对话框和WndProcs支持。此外ATL中没有MFC中的文档/视图模型。取而代之的是ATL那更具伸缩性和灵活 性的通过COM接口(如ActiveX控件)与基于UI的对象之间的沟通模式。
    使用正确的工具非常关键。如果你正在编写一个不可见的COM组件,那么ATL与MFC比起来,从开发效率,可伸缩性,运行时性能以及可执行文件大小各方面来看,ATL可能 都是最好的选择。对于现代基于ActiveX控件的用户界面,ATL所产生的代码也比MFC更小更快。另一方面,与MFC的类向导相比,ATL需要更多的COM知识。ATL与STL一样,对于单层应用没什么帮助,而MFC在这方面保持着它的优势。
    ATL的设计在很大程度上来自STL的灵感,STL与所有ANSI/ISO兼容的C++编译器一起已经被纳入成为标准C++库的一部分。像STL一样,ATL大胆使用C++模板。模板是C++中众多具有争议的特性之一。每每使用不当都会导致执行混乱,降低性能 和难以理解的代码。明智地使用模板所产生的通用性效果和类型安全特性则是其它方法所望尘莫及的。ATL与STL一样陷入了两个极端。幸运的是 在L大胆使用C++模板的同时,编译器和链接器技术也在以同样的步伐向前发展。为当前和将来的开发进行STL和ATL的合理选择。
    尽管模板在内部得到广泛的使用,但是在用ATL技术时,你不用去敲入或关心那些模板中的尖括弧。因为ATL本身带有ATL对象向导(参见图一):






图一 ATL 对象向导


    对象向导产生大量基于ATL模板类缺省的对象实现代码(即框架代码)。这些缺省的对象类型如附表一所列。ATL对象向导允许任何人 快速建立COM对象并且在分分钟之内让它运行起来,不用去考虑COM或ATL的细节问题。当然,为了能充分驾驭ATL,你必须掌握C++,模板和COM编程技术。对于大型的对象类,只要在ATL对象向导所产生的缺省实现(框架代码)中加入方法实现来输出定制接口,这也是大多数开发人员开始实现COM对象时的重点所在。
    初次接触ATL时,其体系结构给人的感觉是神秘和不可思议。HelloATL是一个最简单的基于ATL的进程内服务器源代码 以及用SDK(纯粹用C++编写)实现的同样一个进程内服务器源代码。在真正构建出一个COM组件之前,代码需要经过反反复复多次斟酌和修改。对于想加速开发COM组件速度的主流组件开发人员来说,ATL体系结构并不是什么大问题,因为对象向导产生了所需要的全部框架代码,只 要你加入方法定义即可。对于认真的COM开发人员和系统编程人员来说,ATL提供了一个用C++建立COM组件的高级的,可扩展的体系结构。一旦你理解和掌握了这个体系结构并能驾驭对象向导,你就会看到ATL的表现能力和强大的功能 ,它完全可以和原始的COM编程技术媲美。
    另外一个使用ATL开发COM组件的理由是Visual C++ 5.0+集成开发环境(IDE)对ATL的高度支持。 微软在Visual C++ 5.0+中将ATL所要用到的接口定义语言(IDL)集成到了C++编辑器中。(待续)




最新评论 [发表评论] [文章投稿] 查看所有评论 推荐给好友 打印

I think the word of "DIY" do not always mean the author's own feelings,maybe just only for his negligence,therefore,some one just drew out this meaningless negligence to attack him
Just in one word,it's not justice for him!
I hope everyone do sth firstly should pay more attention to the details!!! ( terryztx 发表于 2004-7-13 9:55:00)
 
一分汗水一分功
如果每个人都付出这么一分汗水,中国的软件水平就会大大的提高。如果每个人都是鸡蛋里挑骨头,只顾叫嚣呼东西,那么中国软件行业还关门大吉的好。
这些有益于国软的事多多益善,希望大家能够积极支持。
知错能该,善莫大矣 ( mingyulantian 发表于 2003-10-27 16:50:00)
 
支持赵老师,你有付出,我们有收获。
虽然英文文章很多,但是能从中选出通俗易懂的,让我们初学者入门的很少,赵老师从中精选,付出劳动,为大家领航,希望大家尊重别人的劳动,好东西大家共享才会进步!
( 悲欢离合 发表于 2003-8-25 15:34:00)
 
那些整天唧唧歪歪的人,如果你是高手的话,说不定当年也是看着赵大侠的文章成长为大侠的,如果你们自认为自己是技术高手的话,希望你们也能为我们这些英文差的人多翻译几篇技术文章。 ( ckp 发表于 2003-4-23 19:10:00)
 
真是想不通,赵湘宁为大家做了这么好的事情,把那么难看的E文翻译了过来,怎么还有人有意见?人家不图钱,不图名,为了大家服务,结果换来这个结果,大家将心比心,换成是你,你心里怎么想?………………

( firingme 发表于 2003-4-9 15:33:00)
 
支持本文作者!
我觉得那些指责人家盗版的人并不怎么样。有能耐你也翻译一个文章我们大家瞧瞧。
我非常敬佩这位作者的奉献精神。最起码他奉献了自己的脑力劳动。
不像那些说三道四的人。只知道整天在那挑别人的毛病。如果不是赵湘宁同志翻译,我们这些英文差的人怎么能详细通读此文?
盗版又怎么样?老外们不是没有一个把文档翻译成汉文的?你们这些挑刺者不是也没有一个肯付出的?
只要有利于大家共同进步,多一个程序员进步,又有什么不好?
就说人家盗版,怎么啦?又没挣什么钱。我反正非常感谢他。
赵湘宁,你不要听少数人的胡言乱语,我们这些初级程序员支持你!不要让他们的梦话打消了你的积极性。 ( wzfree 发表于 2002-12-26 14:42:00)
 
希望下回不要再拿别人的东西说是自已的“原创”了。有兴趣的朋友可以去下面的网址求证一下,http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0697/atl.htm&nav=/msj/0697/newnav.htm

不过说实话,这篇文章写的还是很经典的,我只是对这种拿别人的东西来说是自已“原创”的行为表示不满. ( hehe1 发表于 2002-10-23 9:18:00)
 
这篇文章根本不是原创,这是Microsoft System Journal June 1997上由Don Box写的一篇文章,这小子只不过是翻译了一下,所以属于盗版,根本不是原创。文章本身是很经典的,但说是他原创,你小子有点儿过分了。 ( hehe1 发表于 2002-10-23 9:14:00)
 
good ( canren 发表于 2002-8-23 23:06:00)
 
good ( wakeful 发表于 2002-7-22 15:31:00)
 
.......................................................
More...


版权所有 © 1999 - 2010 VC知识库