用ATL建立轻量级的COM对象

news/2024/7/5 12:21:55

用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++编辑器中。(待续)

 

http://www.niftyadmin.cn/n/1999617.html

相关文章

ansible实现自动化运维

简介 功能强大的自动化运维工具,集合了puppet、cfengine、chef、func、fabric等功能; 能实现多节点发布和远程任务执行等功能,可满足日常自动化运维需求; 特性 No agents:不需要在被管控主机上安装任意客户端&#xf…

html中css基本语法,【HTML+CSS】(1)基本语法

HTML基金会他强调标签,加粗标签短文本引用。长文本引用,这两个标签会让文字带双引號。空格换行,水平横线地址标签单行代码。多行代码,能够增加代码的标签。让显示更加好看无序列表。有序列表: 列表子元素连接标签&…

PHP 文件操作

PHP 文件操作 PHP3.0中的文件操作函数大体和C的类似,但有一些扩充,特别是除了支持对本机文件的访问外,也支持对HTTP和FTP的URL进行访问,只要把这些URL作为文件名传递给文件操作函数就可以了. 主要的文件操作函数有: (1)fclose,feof,fgetc,fgets,fopen,fputs,fseek,ftell,mkdi…

硬件结构(下):SAS扩展器不足导致无奈

Dell EqualLogic PS5000XV的控制器设计十分紧凑,在较小的空间里蕴含着比Dell PowerVault MD3000i的控制器更大的能量。PS5000XV每个控制器具有1GB DDR ECC内存(双控制器合计2GB),是MD3000i的两倍,并同样受到锂离子电池…

走近 STL

走近 STL作者:陶汉军  本文面向的读者:学习过C程序设计语言(也就是说学习过Template),但是还没有接触过STL的STL的初学者。这实际上是我学习STL的一篇笔记,老鸟就不用看了。什么是泛型程序设计  我们可…

计算机管理文件的教学设计,《使用计算机管理文件》教学设计

《使用计算机管理文件》边院镇过村中学 刘涛【教材分析】本课是青岛版《初中信息技术》七年级上册第1单元信息与信息技术的第4课。主要内容是介绍了文件的命名规则和文件管理形式,认识常用文件类型的扩展名和图标,资源管理器的使用方法,用资源…

iSCSI Target和Initiator安装与操作步骤详解

iSCSI Target 编译安装过程 1. 解压&#xff1a; tar zxvf iscsitarget-1.4.18 .t ar.gz 2. cd iscsitarget-1.4.18 3. Linux2.6.32的内核太新了最新的 iSCSI Target 版本 1.4.18 还没有支持&#xff0c;网上有高手做了相应的补丁&#xff0c;于是打上补丁 patch -p1 <iscsi…

合肥工业大学宣城校区计算机大赛,初赛公示_2020年全国高校计算机能力挑战赛...

姓名学校奖项彭正元重庆大学西南赛区 一等奖肖念昕阜阳师范大学华东赛区 一等奖鲁兆成山东财经大学华东赛区 一等奖杨志杰西北师范大学西北赛区 一等奖韩宇博河南大学华中赛区 一等奖侯光华四川农业大学西南赛区 一等奖何亮重庆邮电大学西南赛区 一等奖田平安武汉理工大学华中赛…