ATL简介
ATL,Active Template Library活动模板库,是一种,支持利用C++语言编写ASP代码以及其它程序。通过活动模板库,可以建立,然后通过ASP页面中的对COM对象进行调用。这种COM组件可以包含、对话框等控件。
ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从Microsoft5.0版本开始,Microsoft把ATL集成到Visual C++中。1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。
ATL带来的益处
首先ATL的基本目标就是使COM应用开发尽可能地自动化,这个基本目标就决定了ATL只面向COM开发提供支持。目标的明确使ATL对COM技术的支持达到淋漓尽致的地步。对COM开发的任何一个环节和过程,ATL都提供支持,并将与COM开发相关的众多工具集成到一个统一的中。对于COM/ActiveX的各种应用,ATL也都提供了完善的Wizard支持。所有这些都极大地方便了开发者的使用,使开发者能够把注意力集中在与应用本身相关的逻辑上。
其次,ATL因其采用了特定的基本实现技术,摆脱了大量冗余,使用ATL开发出来的COM应用的代码简练高效,即所谓的“Slim Code”。ATL在实现上尽可能采用优化技术,甚至在其内部提供了所有C/C++开发的程序所必须具有的C启动代码的替代部分。同时ATL产生的代码在运行时不需要依赖于类似MFC程序所需要的庞大的代码模块,包含在最终模块中的功能是用户认为最基本和最必须的。这些措施使采用ATL开发的COM组件(包括ActiveX Control)可以在网络环境下实现应用的结构。
第三,ATL的各个版本对Microsoft的基于COM的各种新的组件技术如MTS、ASP等都有很好的支持,ATL对新技术的反应速度大大快于MFC。ATL已经成为Microsoft支持COM应用开发的主要开发工具,因此COM技术方面的新进展在很短的时间内都会在ATL中得到反映。这使开发者使用ATL进行COM可以得到直接使用COM SDK编程同样的灵活性和强大的功能。
ATL基本技术
虽然使用ATL开发COM 应用是一件非常简单的事情,但是在ATL简单易用的界面后面却包含着复杂的技术。面对ATL生成的大量代码,我们即使不去深入地了解这些代码的含义也可以开发出COM应用来,但是如果我们要充分地挖掘ATL的潜力,开发出更灵活、强大的COM应用,则必须对ATL使用的基本技术有所了解。研究ATL的实质最好的教材就是由Visual C++提供的ATL。本文这一部分只是对ATL中用到的最基本的技术进行简单的介绍。
简单地说来,ATL中所使用的基本技术包括以下几个方面:
COM技术
C++技术(Template)
C++技术(Multi-Inheritance)
COM技术是理解ATL的基础,使用ATL进行开发要对COM技术的基本概念有最低限度的了解。由于COM是一项非常复杂庞大的技术体系,限于本文的篇幅,这里不再赘述。对于本文中提到的COM基本概念也不做过多的解释,请读者参阅有关的参考书籍。
作为ATL最核心的实现技术的模板是对标准C++语言的扩展,但是在大多数的C++中,人们很少使用它,这是因为模板的功能虽然很强,但是它内部机制比较复杂,需要比较多的C++知识和经验才能灵活地使用它。在MFC中的CObjectArray等功能类就是由模板来定义的。完全通过模板来定义程序的整体类结构,ATL是迄今为止做得最为成功的。
所谓简单地说是对类的抽象。我们知道C++语言用类定义了构造对象(这里指C++对象而不是COM对象)的方式,对象是类的实例,而定义的是类的构造方式,使用定义实例化的结果产生的是不同的类。因此可以说是“类的类”。
ATL的使用
使用ATL开发一个COM应用基本可以分为以下几个步骤:
-
创建一个新的ATL工程,并对工程的选项进行适当的配置。
-
向新创建的工程添加新的ATL类,并对该类进行一些初始配置工作。
-
根据COM应用的基本要求向新的ATL类加入新的接口定义,并实现相应的接口成员函数。
-
编译连接工程,注册COM应用。
首先启动Visual C++,选择“File”菜单下的“New...”命令,在“New”对话框中选择“Project”页。
选择“ATL COM AppWizard”项,这是创建ATL工程的AppWizard向导入口。然后在“Project name”编辑框中输入工程的名字,单击“OK”按钮,进入AppWizard对话框。
在AppWizard对话框中主要的设置选项有:
COM服务程序的类型:
-(Dynamic Linking Library) 最终产生一个动态连接库(DLL)形式的COM服务程序;
-(Executable application)最终产生一个可执行程序类型(EXE)的COM服务程序;
- NT服务(NT Service):产生一个以NT服务方式运行的COM服务程序。
允许嵌入Proxy/Stub代码。由Microsoft提供的编译IDL文件以后,将产生用于对象调度(Marshaling)的Proxy/Stub的代码。传统地,这部分代码与COM服务程序的代码是分离的,但是由于新的COM标准支持环境下的COM对象服务,因此在的COM服务程序中也要有Proxy/Stub的支持。为了支持在网络上的传输,ATL允许用户选择将Proxy/Stub的代码包括在生成的DLL代码中。这个选项在EXE和NT服务类型的COM应用条件下不可选。
允许支持MFC。由于ATL对除COM以外的基本的Windows方面的支持极为有限,同时许多程序员对MFC又非常熟悉,因此在ATL的工程设置中允许在ATL工程内部支持使用MFC,即可以使用MFC定义的类。这在一方面来看是非常方便的,特别是对于习惯于使用MFC的开发人员来说,能够使用MFC提供的各种功能强大的类的支持,而不必直接使用Windows SDK。从另一个方面来看,在ATL工程中使用MFC同时就丧失了ATL代码轻量级的特点。
支持MTS。MTS是Microsoft Transaction Server的缩写,它是Microsoft在COM技术方面的一个新的分支,这里不作详细说明。
完成上面的设置以后,可以选择FINISH完成工程的设置,ATL将创建相应的工程。
添加ATL类
添加"ATL Simple Object"
右边部分说明了每种类型的详细内容,对于一般的COM服务程序,使用对象表中的简单对象(Simple Object)就可以了。
选定待创建对象的基本类型以后,单击“Next>;”按钮进入下一步,进入对象属性设置对话框,如图4和图5所示。
对象属性设置分为两个过程:先是对象名字标识的设定,然后是对对象的基本属性进行设置。首先是对象的名字标识设置。
在对象标识编辑框中输入待创建对象的名字,ATL对象向导将同步地根据用户输入的对象标识设定该对象的C++标识和COM标识。对象的C++标识包括对象的类名,cpp文件名和头文件名。COM标识包括对象在类型库中的CoClass段和实现的主接口的名字,同时还有在中的以及ProgID。
对象名字标识设置完成以后,选择对象(Attribute)进入对象的属性设置页面。
对象的属性设置是ATL对象创建过程中最复杂的部分,包括以下几个主要部分:
对象的线程模型(Thread Model)
对象的线程模型是COM对象在多线程环境下被访问时对访问方式的控制,缺省情况下在ATL中采用的是套间模型Apartment,由系统通过方式提供。
对象的接口模型(Interface)
COM对象的接口可以是双接口(Dual Interface)。双接口不同于普通接口(Custom Interface) 之处在于双接口是从Automation基本接口IDispatch继承的,而普通接口是从IUnknown接口直接继承来的。缺省的接口模型是双接口。
对象的聚合模型(Aggregate)
COM规范不允许对象的实现继承,但是可以通过聚合方式重用其它的COM对象。ATL对象属性设置中的聚合模型可以指定待创建的COM对象是否支持聚合模型。缺省的选项是支持对象的聚合。
对象对错误处理的支持(Support ISupportErrorInfo)
选取这个选项可以在对象的运行过程中支持错误处理。缺省情况下这个选项不被选中。
对象对连接点的支持(Support Connection Points)
连接点是COM对象的事件机制。选中这个选项可以使待创建的COM对象具有发出事件的能力。缺省情况下该选项不被选中。
对象对自由的支持(Free Thread Marshaller,简称FTM)
对象的自由是对象在处于自由线程模型状态下,为了简化对象的访问过程而采用的一种优化策略。缺省情况下该选项不被选中。
对于上述的任何一个选项的详细描述都涉及到COM技术一些核心的内容,并且都已超出本文的范围,因此本文只对ATL给出的缺省选项加以说明,对这些内容感兴趣的读者可以参考Microsoft提供的文档。
完成了上面的设置以后,就可以按“OK”按钮完成对象的创建过程。下一步就是向所生成的ATL类的接口中加入成员函数的定义,以及接口成员函数的实现过程。
添加方法
添加属性
查看添加的属性和方法
添加事件
实现事件
查看事件
添加“ATL Control"类,主要和”ATL Simple Object“的区别
选择Stock Properties
查看添加的方法,属性和事件和ATL Simple Object 差不多,这里就不多说
如何调用ATL
-
建立一个Dialog工程
-
用regsvr32 注册ATL的DLL文件,注意win7里面需要管理员权限来注册DLL
-
通过Insert ActiveX Control...导入制定的类,生成对应的接口.h和.cpp文件
-
通过实例化这些类来调用相关的方法,这里就不详细描述。
阅读(2588) | 评论(0) | 转发(0) |