三. ATL基本使用
这一部分将重点介绍ATL的基本使用过程。由于ATL已经被集成在Microsoft Visulal Studio的Visual C++开发环境中,因此要使用ATL必须先安装Visual C++。在下面的讨论中有关COM的基本知识请参阅有关的文档,这里不再详细说明。给出的图是在Microsoft Windows 98平台下Visual Studio 6.0的使用示意图。 使用ATL开发一个COM应用基本可以分为以下几个步骤: 创建一个新的ATL工程,并对工程的选项进行适当的配置。 向新创建的工程添加新的ATL类,并对该类进行一些初始配置工作。 根据COM应用的基本要求向新的ATL类加入新的接口定义,并实现相应的接口成员函数。 编译连接工程,注册COM应用。 下面将根据这些步骤依次介绍ATL的基本使用过程。 1. 创建工程 首先启动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提供的MIDL编译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将创建相应的工程。 2. 加入ATL类 完成工程的创建和设置以后,下一步就是向工程中加入一个新的ATL类。Visual Studio集成环境提供了向导工具“ATL Object Wizard”用于加入一个新的ATL类。操作过程并不复杂,只是一组对话框操作而已。 首先通过集成环境的“Insert”菜单下的“New ATL Object…”命令进入“ATL Object Wizard”对话框。 这个对话框即为创建ATL对象的向导起始界面。对话框的左边部分说明了待创建对象的基本类型,这里主要有以下的几种类型: 对象(Object)基本的COM对象类型; 控制(Control)ActiveX Control类型的ATL对象; 其他(Miscellaneous)辅助功能,如对话框的生成等; 数据访问(Data Access)数据访问,支持MTS等。 右边部分说明了每种类型的详细内容,对于一般的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类的接口中加入成员函数的定义,以及接口成员函数的实现过程。
|