版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1313TL(TheActiveemplateLibrary的缩写,其设计旨在让人C++方便灵活地开发COM对象。TL本身相当小巧灵活,这是它最大的优点。用它可以创建轻量级的,自包含的,可复用的二进制代码,不用任何附DLLs支持。ATL1.0版本提供了用于实现IUnknown、IClassFactory、IDispatch、IConnectionPointContainerCOM2.0ActiveX支持、WinSockWin32API的完整包装(ATL2.0的控件实现提供了WndProc的支持。ATLMFC的文档-视图模型,它假定用户将使用可以升级和更加灵活的COM方式(如ActiveX控件)来与基于UIATLVC++13.113.1ATL的优ATL是在单层(single-tier)应用逐渐过时,分布式应用逐渐成为主流的环境中诞生的,它所形成的出色的构架专门用于开发现代分布式应用所需的轻量级COM组件。ATLCOMCOMSDKCOMMFCCOMCOMSDKCOM组件是最基本也是最灵活的方式。通过使用微软公司COM程序。但是,这种开发方式的难度和工作量都很大,COMCOMSDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。MFCCOM的支持比手工编写COM程序有了很大的进步。MFC采用面向对象的方COMMFCC++COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏COM接口的定义和对象的注册等常用功能,开发者可以使用这些宏来定COMMFCActiveX控件的支持,VisualC++也提供了相应的应用程序向导支持,这种可视化的工具更加方便了COM应用的开发。MFCCOMMFCCOMIDLMFC设计的基本出发点决定的。MFCWindows平台编程开发的面向对象的封装,涉及到了Windows编程的各个方面,COMWindows平台编程开发的一个部分也得到MFC的支持,但是MFCCOM的支持是以其全局目标为出发点的,因COMMFCCOM的支持并不能够很好的满使用MFC开发的ActiveX控件的代码冗余量大,而且必须要依赖于MFC的运行MFCCOMMFC的继承实现的本质,使得ActiveX控件必须承担运行时间库的冗余部分。如果采用静态连接MFC运行时刻库的方式,这将使ActiveX控件代码过于庞大,不适合在Internet网上传输;如果采用使得MFC对COM技术的支持在网络应用的环境下也显得很不灵活。作为一个模块化的标准组件,ATLMFCATL库使得实现IUnknown和IClassFactory十分轻松。ATL因其采用了特定的基本实现技术,摆脱了大量冗余代码,使用ATL开发出来的COM应用的代码简练高效(即所谓的SlimCode。ATL在实现上尽可能采用优化技术,甚至在其内部提供了所有C/C++开发的程序所必须具有的CATL产生的代码在运行时不需要依赖于类MFC程序所需要的庞大的代码模块,包含ATLCOMATLCOM(包括ActiveX控件)对COM开发的任何一个环节和过程,ATL都提供支持,并将与COM开发相关的众COM/ActiveX的各种应用,ATL也都提供了完ATLCOM组件的另一VisualStudio集成开发环ATL的高度支持。微软VisualC5.0ATL所要用到的接口定义语言(IDL)集成到C++编辑器中。ATL的对象向导产生大量基于ATL模板类缺省的对象实现代码(即框架代码。ATL对象向导允许用户快速建立并且运行COMCOMATL的细节问题。对于大型的对象类,只要在ATL对象向导所产生的缺省实现(框架代码)中加入方法实现来输出COM13.2ATLCOM的支ATLC++中的模板技术(Template)和多重继承技术(Multi-Inheritance)来实COM13.2.1ATL最核心的实现技术的模板是对标准C++语言的扩展。所谓模板类简单地说是对类的抽象。在C++语言中用类定义了构造C++对象的方式,对象是类的实例,而模板类在C++template<classT>classMyTemplate{MyTemplate<T>(~MyTemplate<T>(voidFunc(intp)}…template<classT>{…}template<classT>{…}template<classT>voidMyTemplate<T>::Func(…}template<classT>voidMyTemplate<T>::Func(int{…}首先使用C++的关键字“template”来声明一个模板类的定义。在关键字后面是用尖括号括起来的类型参数。正是根据这个类型参数,编译器才能在编译过程中将模板类的具体定义转化为一个实际的类的定义,即生成一个新的类。接下来的定义方式与普通的类定义十分相似,只是在类的函数定义中都要带有类型参数的说明。模板类是对标准C++语言的最新扩展,它的功能很强大,ATL的核心就是由几十个模板类构成的,尽管模板在内部得到广泛的使用,但是在用ATL技术时,用户不用输入那些模板中的尖括弧,这是因为ATL本身带有ATL对象向导。ATL中,C++类通过继承CComObjectRootEx,指定它们想用的组件模型CComObjectRootEx类是一个基于模板的类,将线性模型作为其唯一参数。ATL有两个处理引CComSingleThreadModel和CComMultiThreadModel。这些类每个都有一个递增和一个递减函数,它们之间的区别是CComSingleThreadModel用标准C++操作符(++和--)实现递增和递减;而CComMultiThreadModel使用线程安全的InterlockedIncrementInterlockedDecrement函数来实现这两个功能。利用用来实例化CComObjectRootEx的模板参数,它能正确运行给定的组件类型。与MFC类似,ATL使用基于映射表的查找机制实现QueryInterface。CComObjectRootBase类通过一个接口映射处理类的QueryInterface函数。BEGIN_COM_MAP和END_COM_MAP宏定义了一个接口映射的开始和结束。然而,与MFC不同的是,ATL提供17种途径来组成一个接口映射,例如使ATL的基于模板的接口实现类如IOleObjectImpl来的vptrs。这包括了那些从tear-off的类或者由聚合提供的类来的vptrs。ATL对类对象(以及IClassFactory)的支持也来自模板,而MFC的类对象支过和一些宏实现。 的类对象支持来CComCoClass/CcomClassFactory类家族和CComCreator类家族CComCoClass包含了类的GUID,定义了COM类的错误处理设施。CComCreator类提供了CreateInstance的实现,供CComClassFactory使用。ATL包括DECLARE_CLASS_FACTORYFACTORY2、CLARE_CLASS_FACTORY_AUTO_THREADDECLARE_CLASS_FACTORY_SINGLETON等宏用来使各种具体的类工厂支持有IDispatch支持来,ATLIDispatch的支持更加是COM中心的。MFC使用了一种hand-rolledIDispatch实现ATL使用更加标准的方法来加载一个接口的类型信息并代表标准的类型库编译器13.2.2CO13.2.2COM这样一个复杂的技术体系在实现效率上得到了很大的提高。通过使用模板类,用户可以把精力集中在自己开发的类的基本逻辑上,在完成了自己的类的设计以后,通过继承不同的类,生成COM的功能,同时又避免了采用单继承结构造成的大量功能冗余。多继承技术同模板一样,是C++语言中极具争议性的技术。使用多继承技术可以使程序的设计和实现更加灵活,但是,由于多继承的复杂性和自身概念上的一些问题,使多继承在各种面向对象的语言环境中得到的支持都非常有限。例如MFC就不支持多继承技术。多继class{voidclassB:public{voidvoidclassC:public{voidvoidclassD:publicB,{}DD*d=newAB(A*)d-//类D通过类B与类C分别继承A,因此不知道执行哪个f函ATL使用了C++最新规范中加入的两个运算符static_cast、dynamic_castD*d=newstatic_cast<A*>(static_cast<C*>(pD))-D*d=newstatic_cast<A*>(static_cast<C*>(pD))-13.3ATL编程实例―获取操作系统VisualC++ATL的基本使用方法。本实例先创建一个进程内COM组件,利用组件的接口可以查询本机的操作系统版本。接着创建一个COM13.3.1ATLATLCOMATLATLCOMATL类加入新的接口定义,并实现相应的COM1.创建话框,在“模板”中选择“ATLCOM程序向导”,在“名称”文本框中输入项目名称ATL_Sample,单击“确定”按钮进入“ATL项目向导对话框”,如图13-1图13- ATL项目向13-1序”设置界面中可以指定项目的应用程序类型和功能支持。对此界面设置如图13-213-ATL项目向13-ATL项目向导对话框“应用程序设置”界动态链接库:产生动态链接库类型(DLL)的COM可执行文件:产生可执行程序类型(EXE)的COMNTCOM服务程序。允许合并proxy/stub代码:Microsoft提供MIDLIDL文件以后,将产生用于对象调度(Marshaling)由Proxy/Stub的代码。传统地,这部分代码与COM服务程序的代码是分离的,但是由于新COMCOMCOM服务程序中Proxy/Stub的支持。为了支持在网络上的传输,ATLProxy/Stub的代码包括在生成DLL代码中。这个选项EXENTCOM应用条件下不可MFCATLCOMWindows编程方面的支持很有限,同时许多程序员对MFC又非常熟悉,因此在ATL的工程设置中允许ATL工程内部支持MFC,即可以使用MFC定义的类。这在一方面来看是非常方便MFCMFC提供的各种功能强大的WindowsSDKATLMFC同时就丧失了ATL代码轻量级的特点。COM+1.0COM+1.0界面设置完毕后,单击“完成”按钮,ATLATL项目的框架。向导创建的文件ATL_Sample.cpp中包含进程内部服务器的DLL出口的实现以及本地服务器中的DllMainDllCanUnloadNowDllGetClassObjectDllRegisterServer和ATL_Sample.def中包含DLLATL_Sample.idlMIDLATL_Sample.idlMIDLATL_Sample.tlbmarshaling2.ATLATL,将出现“ATL13-3图13- 添加ATL对在向导中的“简称”文本框中输入Version,ATL对象向导将同步地根据用户输入的对象标识设定该对象的C++标识和COM标识。对象的C++标识包括对象的类名,cpp文件COM标识包括对象在类型库中的CoClassProgID13-4图13- ATLATL和.cppIDL文件。有了这些文件以后,接着就可以为接口和.cppIDL文件。有了这些文件以后,接着就可以为接口3.在“类视图”窗口中用鼠标右键单击新增的接口IVersion,在弹出的快捷菜单中选择框的设置如图13-6所示,设置完成后单击“完成”按钮完成方法的添加。13-在本例中添加函GetOsVersion,用来取得本机的操作系统版本。添加方法为ATL所做的工作。ATL在接口的定且在类对应的.cpp文件中,加入了此方法的实现框架如下:STDMETHODIMPCVersion::GetOsVersion(BSTR*{//TODO:return}基本完成了。依照这种方式,用户可以完成整个COM对象的定义和实现。Version.cpp//Version.cpp:CVersion#include#include//#include//加入comutil#include#pragmacomment(lib,"comsupp.lib"//STDMETHODIMPCVersion::GetOsVersion(BSTR*{//TODO:charOSVERSIONINFOVersionInformation;//版本信息VersionInformation.dwOSVersionInfoSizesizeof(OSVERSIONINFO);//使用GetVersionEx{{casestrcpy(szOSVersion"WIN32S复制字符串casestrcpy(szOSVersion,"WIN95/98");casestrcpy(szOSVersion,"WINNT");strcpy(szOSVersion,"UnKnown");}}{strcpy(szOSVersion,}*bstrVersion=return}4.生成VisualC++return}4.生成VisualC++DLL对ATL项目的编译连接过程包括下面的几个步骤编译工程的.cpp文件形成目标文件。COMScript简称RGS)是ATL提供的文本方式的注册辅助文件。此项目中的注册脚本文件Version.rgs如下:{//对象的ATL_Sample.Version.1=s'Version{CLSID=s'{430EFA89-3AD0-4F6E-A581-}ATL_Sample.VersionsVersionClass'{CLSID=s'{430EFA89-3AD0-4F6E-A581-CurVer=s}NoRemove{//对象的CLSIDForceRemove{430EFA89-3AD0-4F6E-A581-C32FF8ABC30A}=s'Version{ProgID=s'ATL_Sample.Version.1'VersionIndependentProgID=s'ATL_Sample.Version'ForceRemoveInprocServer32=s ForceRemoveInprocServer32=s {valThreadingModelsApartment'}valAppID=s'TypeLib'=s'{DA511C5D-2213-4E1A-9B7F-}}}RGSCOMRGS文件,但是必要时也可以手工修改RGS文件来定制模块的注册过程。用ATL编程使得COM组件的开发不再变得繁琐和重复大量的工作,同时与使用MFC编程相比它的代码体积要小得多,这是因为ATL使用了模板类技术。ATL使我们可以很容易创建COM对象、自动化服务器和ActiveX控件,ATL为许多基本的COM接口都13.3.2COM创建COM对象的实例。这可以通过调用Windows系统的API函数CoCreateInstanceIUnknown::ReleaseCOM1.13-713-设置“Win322.添13-设置“Win322.添加在菜单栏选择“文件”→“新建”将打开“新建”对话框,在其中选择模板为“C++CPP文件名ClientClient.cpp。修改此文件如下:#include#include//加入comutil#include#pragmacomment(lib,"comsupp.lib" #include"..\ATL_Sample\ATL_Sample.h"#include"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药物分析芳酸及其酯类药物的分析
- 管理教育管理与教育管理学
- 老年糖尿病的合理用药
- 人教版高中地理必修第8册第12章中国地理单元测试卷及答案
- 2026年苏教版高中地理下册第6章环境保护测试卷及答案
- 2026秋小学苏教版科学二年级上册第四单元学情测试练习附参考答案三套
- 广东省深圳市第二中学八年级英语第10单元听力专项训练习题及答案
- 肿瘤标志物的组合及意义
- 财政与税收国家财政及作
- 白细胞形态与分类
- 2026年国企竞聘案例分析题解题思路含答案
- 矿山地质课件
- 感染性疾病科医生进修汇报
- 泥浆清运合同(2025版)
- 睿达杯二试试题和答案
- 再别康桥混声四部合唱谱
- 内部工作流程优化调研表
- 《四川省汉源县岩窝沟铅锌、磷矿勘探实施方案》评审意见书
- 高中技术苏教必修1课件51方案的构思方法――手机支架的设计和制作共18张
- 2024年第六届全国农业行业职业技能大赛动物疫病防治员技能竞赛理论考试题库(含答案)
- 泥炭藓在土壤改良中的作用
评论
0/150
提交评论