<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ATL</title>
	<atom:link href="https://www.aitaocui.cn/tag/249834/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Sun, 27 Nov 2022 18:00:54 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>ATL</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ATL(微软程序库)</title>
		<link>https://www.aitaocui.cn/article/361845.html</link>
					<comments>https://www.aitaocui.cn/article/361845.html#respond</comments>
		
		<dc:creator><![CDATA[菌落]]></dc:creator>
		<pubDate>Sun, 27 Nov 2022 18:00:54 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[ATL]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=361845</guid>

					<description><![CDATA[ATL，Active Template Library活动模板库，是一种微软程序库，支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库，可以建立COM组件，...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>ATL，Active Template Library活动模板库，是一种微软程序库，支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库，可以建立COM组件，然后通过ASP页面中的脚本对COM对象进行调用。这种COM组件可以包含属性页、对话框等控件。</p>
</article>
<article>
<h1>简介</h1>
<p>自从1993年Microsoft首次公布了COM技术以后，Windows平台上的开发模式发生了巨大的变化，以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时，对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术，令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具，提高开发效率，更好地利用这项技术。</p>
<p>针对这种情况，Microsoft公司在推出COM SDK以后，为简化COM编程，提高开发效率，采取了许多方案，特别是在MFC（Microsoft Foundation Class）中加入了对COM和OLE的支持。但是随着Internet的发展，分布式的组件技术要求COM组件能够在网络上传输，而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求，因此Microsoft在1995年又推出了一种全新的COM开发工具ATL。</p>
<p>ATL是ActiveX Template Library的缩写，它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码（Effective and Slim code），同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用，从MicrosoftVisual C++5.0版本开始，Microsoft把ATL集成到Visual C++开发环境中。1998年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。ATL已经成为Microsoft标准开发工具中的一个重要成员，日益受到C++开发人员的重视。</p>
<h1>益处</h1>
<p>这还要先从ATL产生以前的COM开发方式说起。</p>
<p>在ATL产生以前，开发COM组件的方法主要有两种：一是使用COM SDK直接开发COM组件，另一种方式是通过MFC提供的COM支持来实现。</p>
<p>直接使用COM SDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包，我们可以直接编写COM程序。但是，这种开发方式的难度和工作量都很大，一方面，要求开发者对于COM的技术原理具有比较深入的了解（虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的，但对于COM这样一整套复杂的技术而言，在短时间内完全掌握是很难的），另一方面，直接使用COM SDK要求开发人员自己去实现COM应用的每一个细节，完成大量的重复性工作。</p>
<p>这样做的结果是，不仅降低了工作效率，同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要，但这种编程方式并不符合组件化程序设计方法所倡导的可重用性，因此，直接采用COM SDK不是一种理想的开发方式。</p>
<p>使用MFC提供的COM支持开发COM应用可以说在使用COM SDK基础上提高了自动化程度，缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中，开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性，MFC中有许多预定义宏，这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。</p>
<p>另外，在MFC中还提供对Automation和 ActiveX Control的支持，对于这两个方面，Visual C++也提供了相应的AppWizard和ClassWizard支持，这种可视化的工具更加方便了COM应用的开发。</p>
<p>MFC对COM和OLE 的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持是不够完善和彻底的，例如对COM接口定义的IDL语言，MFC并没有任何支持，此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。</p>
<p>MFC被设计成对Windows平台编程开发的面向对象的封装，自然要涉及Windows编程的方方面面，COM作为Windows平台编程开发的一个部分也得到MFC的支持，但是MFC对COM的支持是以其全局目标为出发点的，因此对COM 的支持必然要服从其全局目标。从这个方面而言，MFC对COM的支持不能很好的满足开发者的要求。</p>
<p>随着Internet技术的发展，Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广，然而使用MFC开发的ActiveX Control，代码冗余量大（所谓的“肥代码 Fat Code”），而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关，但是由于MFC的继承实现的本质，ActiveX Control必须背负运行时刻库这个沉重的包袱。</p>
<p>如果采用静态连接MFC运行时刻库的方式，这将使ActiveX Control代码过于庞大，在网络上传输时将占据宝贵的网络带宽资源；如果采用动态连接MFC运行时刻库的方式，这将要求浏览器一方必须具备MFC的运行时刻库支持。总之MFC对COM技术的支持在网络应用的环境下也显得很不灵活。</p>
<p>解决上述COM开发方法中的问题正是ATL的基本目标。</p>
<p>首先ATL的基本目标就是使COM应用开发尽可能地自动化，这个基本目标就决定了ATL只面向COM开发提供支持。目标的明确使ATL对COM技术的支持达到淋漓尽致的地步。对COM开发的任何一个环节和过程，ATL都提供支持，并将与COM开发相关的众多工具集成到一个统一的编程环境中。对于COM/ActiveX的各种应用，ATL也都提供了完善的Wizard支持。所有这些都极大地方便了开发者的使用，使开发者能够把注意力集中在与应用本身相关的逻辑上。</p>
<p>其次，ATL因其采用了特定的基本实现技术，摆脱了大量冗余代码，使用ATL开发出来的COM应用的代码简练高效，即所谓的“Slim Code”。ATL在实现上尽可能采用优化技术，甚至在其内部提供了所有C/C++开发的程序所必须具有的C启动代码的替代部分。同时ATL产生的代码在运行时不需要依赖于类似MFC程序所需要的庞大的代码模块，包含在最终模块中的功能是用户认为最基本和最必须的。这些措施使采用ATL开发的COM组件（包括ActiveX Control)可以在网络环境下实现应用的分布式组件结构。</p>
<p>第三，ATL的各个版本对Microsoft的基于COM的各种新的组件技术如MTS、ASP等都有很好的支持，ATL对新技术的反应速度大大快于MFC。ATL已经成为Microsoft支持COM应用开发的主要开发工具，因此COM技术方面的新进展在很短的时间内都会在ATL中得到反映。这使开发者使用ATL进行COM编程可以得到直接使用COM SDK编程同样的灵活性和强大的功能。</p>
<h1>基本技术</h1>
<p>虽然使用ATL开发COM 应用是一件非常简单的事情，但是在ATL简单易用的界面后面却包含着复杂的技术。面对ATL生成的大量代码，我们即使不去深入地了解这些代码的含义也可以开发出COM应用来，但是如果我们要充分地挖掘ATL的潜力，开发出更灵活、强大的COM应用，则必须对ATL使用的基本技术有所了解。研究ATL的实质最好的教材就是由Visual C++提供的ATL源代码。本文这一部分只是对ATL中用到的最基本的技术进行简单的介绍。</p>
<p>简单地说来，ATL中所使用的基本技术包括以下几个方面：</p>
<p>COM技术</p>
<p>C++模板类技术（Template)</p>
<p>C++多继承技术（Multi-Inheritance)</p>
<p>COM技术是理解ATL的基础，使用ATL进行开发要对COM技术的基本概念有最低限度的了解。由于COM是一项非常复杂庞大的技术体系，限于本文的篇幅，这里不再赘述。对于本文中提到的COM基本概念也不做过多的解释，请读者参阅有关的参考书籍。</p>
<p>作为ATL最核心的实现技术的模板是对标准C++语言的扩展，但是在大多数的C++编程环境中，人们很少使用它，这是因为模板的功能虽然很强，但是它内部机制比较复杂，需要比较多的C++知识和经验才能灵活地使用它。在MFC中的CObjectArray等功能类就是由模板来定义的。完全通过模板来定义程序的整体类结构，ATL是迄今为止做得最为成功的。</p>
<p>所谓模板类简单地说是对类的抽象。我们知道C++语言用类定义了构造对象（这里指C++对象而不是COM对象）的方式，对象是类的实例，而模板类定义的是类的构造方式，使用模板类定义实例化的结果产生的是不同的类。因此可以说模板类是“类的类”。</p>
<h1>基本使用</h1>
<p>这一部分将重点介绍ATL的基本使用过程。由于ATL已经被集成在Microsoft Visulal Studio的Visual C++开发环境中，因此要使用ATL必须先安装Visual C++。在下面的讨论中有关COM的基本知识请参阅有关的文档，这里不再详细说明。</p>
<p>使用ATL开发一个COM应用基本可以分为以下几个步骤：</p>
<p>创建一个新的ATL工程，并对工程的选项进行适当的配置。</p>
<p>向新创建的工程添加新的ATL类，并对该类进行一些初始配置工作。</p>
<p>根据COM应用的基本要求向新的ATL类加入新的接口定义，并实现相应的接口成员函数。</p>
<p>编译连接工程，注册COM应用。</p>
<p>下面将根据这些步骤依次介绍ATL的基本使用过程（给出的是Visual Studio 6.0的使用）：</p>
<p>1. 创建工程</p>
<p>首先启动Visual C++集成开发环境，选择“File”菜单下的“New&#8230;”命令，在“New”对话框中选择“Project”页。</p>
<p>选择“ATL COM AppWizard”项，这是创建ATL工程的AppWizard向导入口。然后在“Project name”编辑框中输入工程的名字，单击“OK”按钮，进入AppWizard对话框。</p>
<p>在AppWizard对话框中主要的设置选项有：</p>
<p>COM服务程序的类型：</p>
<p>-动态连接库（Dynamic Linking Library） 最终产生一个动态连接库（DLL）形式的COM服务程序；</p>
<p>-应用程序（Executable application）最终产生一个可执行程序类型（EXE）的COM服务程序；</p>
<p>&#8211; NT服务（NT Service）：产生一个以NT服务方式运行的COM服务程序。</p>
<p>允许嵌入Proxy/Stub代码。由Microsoft提供的MIDL编译IDL文件以后，将产生用于对象调度（Marshaling）的Proxy/Stub的代码。传统地，这部分代码与COM服务程序的代码是分离的，但是由于新的COM标准支持多线程环境下的COM对象服务，因此在动态连接库的COM服务程序中也要有Proxy/Stub的支持。为了支持在网络上的传输，ATL允许用户选择将Proxy/Stub的代码包括在生成的DLL代码中。这个选项在EXE和NT服务类型的COM应用条件下不可选。</p>
<p>允许支持MFC。由于ATL对除COM以外的基本的Windows编程方面的支持极为有限，同时许多程序员对MFC又非常熟悉，因此在ATL的工程设置中允许在ATL工程内部支持使用MFC，即可以使用MFC定义的类。这在一方面来看是非常方便的，特别是对于习惯于使用MFC的开发人员来说，能够使用MFC提供的各种功能强大的类的支持，而不必直接使用Windows SDK。从另一个方面来看，在ATL工程中使用MFC同时就丧失了ATL代码轻量级的特点。</p>
<p>支持MTS。MTS是Microsoft Transaction Server的缩写，它是Microsoft在COM技术方面的一个新的分支，这里不作详细说明。</p>
<p>完成上面的设置以后，可以选择FINISH完成工程的设置，ATL将创建相应的工程。</p>
<p>2. 加入ATL类</p>
<p>完成工程的创建和设置以后，下一步就是向工程中加入一个新的ATL类。Visual Studio集成环境提供了向导工具“ATL Object Wizard”用于加入一个新的ATL类。操作过程并不复杂，只是一组对话框操作而已。</p>
<p>首先通过集成环境的“Insert”菜单下的“New ATL Object…”命令进入“ATL Object Wizard”对话框。</p>
<p>这个对话框即为创建ATL对象的向导起始界面。对话框的左边部分说明了待创建对象的基本类型，这里主要有以下的几种类型：</p>
<p>对象（Object）基本的COM对象类型；</p>
<p>控制（Control）ActiveX Control类型的ATL对象；</p>
<p>其他（Miscellaneous）辅助功能，如对话框的生成等；</p>
<p>数据访问（Data Access）数据访问，支持MTS等。</p>
<p>右边部分说明了每种类型的详细内容，对于一般的COM服务程序，使用对象表中的简单对象（Simple Object）就可以了。</p>
<p>选定待创建对象的基本类型以后，单击“Next&gt;；”按钮进入下一步，进入对象属性设置对话框，如图4和图5所示。</p>
<p>对象属性设置分为两个过程：先是对象名字标识的设定，然后是对对象的基本属性进行设置。首先是对象的名字标识设置。</p>
<p>在对象标识编辑框中输入待创建对象的名字，ATL对象向导将同步地根据用户输入的对象标识设定该对象的C++标识和COM标识。对象的C++标识包括对象的类名，cpp文件名和头文件名。COM标识包括对象在类型库中的CoClass段和实现的主接口的名字，同时还有在系统注册表中的类型名以及ProgID。</p>
<p>对象名字标识设置完成以后，选择对象属性页（Attribute）进入对象的属性设置页面。</p>
<p>对象的属性设置是ATL对象创建过程中最复杂的部分，包括以下几个主要部分：</p>
<p>对象的线程模型（Thread Model）</p>
<p>对象的线程模型是COM对象在多线程环境下被访问时对访问方式的控制，缺省情况下在ATL中采用的是套间模型Apartment，由系统通过消息队列方式提供并发控制。</p>
<p>对象的接口模型（Interface）</p>
<p>COM对象的接口可以是双接口（Dual Interface）。双接口不同于普通接口（Custom Interface) 之处在于双接口是从Automation基本接口IDispatch继承的，而普通接口是从IUnknown接口直接继承来的。缺省的接口模型是双接口。</p>
<p>对象的聚合模型（Aggregate）</p>
<p>COM规范不允许对象的实现继承，但是可以通过聚合方式重用其它的COM对象。ATL对象属性设置中的聚合模型可以指定待创建的COM对象是否支持聚合模型。缺省的选项是支持对象的聚合。</p>
<p>对象对错误处理的支持（Support ISupportErrorInfo)</p>
<p>选取这个选项可以在对象的运行过程中支持错误处理。缺省情况下这个选项不被选中。</p>
<p>对象对连接点的支持（Support Connection Points)</p>
<p>连接点是COM对象的事件机制。选中这个选项可以使待创建的COM对象具有发出事件的能力。缺省情况下该选项不被选中。</p>
<p>对象对自由线程调度的支持（Free Thread Marshaller,简称FTM)</p>
<p>对象的自由线程调度是对象在处于自由线程模型状态下，为了简化对象的访问过程而采用的一种优化策略。缺省情况下该选项不被选中。</p>
<p>对于上述的任何一个选项的详细描述都涉及到COM技术一些核心的内容，并且都已超出本文的范围，因此本文只对ATL给出的缺省选项加以说明，对这些内容感兴趣的读者可以参考Microsoft提供的文档。</p>
<p>完成了上面的设置以后，就可以按“OK”按钮完成对象的创建过程。下一步就是向所生成的ATL类的接口中加入成员函数的定义，以及接口成员函数的实现过程。</p>
<p>3. 加入接口定义，实现接口函数</p>
<p>加入了ATL类定义之后，我们可以打开Visual C++集成环境下项目管理器（Workspace）中的Class View来检查生成的类定义的情况。我们可以看到一个新的类已经生成，同时，还生成了相应的接口定义。ATL Object Wizard为我们生成了类定义的.h 和.cpp文件，此外还有用于接口定义的IDL文件。有了这些文件以后，我们就可以为接口加入成员函数，完成类的定义。</p>
<p>首先在Class View中选中相应的接口，显示为接口IATLTest，单击鼠标右键打开菜单，如图7。此弹出式菜单定义了为接口加入属性和方法的操作。选取其中的“Add Method&#8230;”项，可以为接口加入方法成员；选取“Add Property&#8230;”则可以为接口加入新的属性成员。</p>
<p>加入属性和方法的对话框可以参看图8和图9。如果我们要在接口中加入一个方法，则选取“Add Method&#8230;”菜单命令。假设方法名为ABC，方法的返回类型为COM规定的HRESULT类型。我们也可以定义非HRESULT返回类型的函数，但是这需要手工修改接口定义的IDL文件。我们定义ABC方法的一个参数为a，类型为整数型。完成了方法的定义以后，单击“OK”按钮则把此方法加入到接口中。</p>
<p>属性的加入过程是类似的。属性加入对话框要求指定属性的类型、名字以及属性的访问方式。在属性和方法的编辑对话框中都有一个“Attributes”按钮，在给出了一个属性或方法的基本定义之后，单击此按钮，可以对属性和方法的一些高级特性进行设置。</p>
<p>方法成员加入以后，我们可以通过Class View来检查ATL为我们所做的工作。首先我们看到ATL在接口的定义中加入了该方法的定义；同时在对应的ATL类定义中，也加入了一个相应的方法的定义；在类对应的.cpp文件中，加入了此方法的实现框架。此后，我们只要在这个函数框架中加入该方法的代码逻辑，一个接口函数的定义和实现就基本完成了。依照这种方式，我们可以完成整个COM对象的定义和实现。</p>
<p>完成以上的步骤之后，我们就可以编译连接应用了。</p>
<p>4. 编译连接应用、注册COM服务程序</p>
<p>对ATL工程的编译连接过程包括下面的几个步骤：</p>
<p>使用MIDL编译工程的IDL文件，形成接口定义的头文件和用于调度（Marshalling）的代码；</p>
<p>编译工程的.cpp文件形成目标文件；</p>
<p>连接目标文件，形成应用模块；</p>
<p>注册COM服务程序。</p>
<p>关于工程编译连接的其它部分同Visual C++中MFC工程的编译连接过程相似，这里只重点介绍一下COM服务程序的注册过程。</p>
<p>在ATL中，COM服务程序的注册是在工程编译连接的最后阶段，由ATL辅助完成的。在手工的COM编程中，服务程序的注册是比较麻烦的工作。在ATL中，系统通过读取在建立工程过程中形成的注册脚本文件来完成注册工作。注册脚本（Register Script 简称RGS）是ATL提供的文本方式的注册辅助文件。下面是注册脚本文件的一个实例。</p>
<h1>公司介绍</h1>
<p>微软公司成立于1975年。几十年来，微软一直致力于为全世界用户创造新的机遇、价值和体验。微软始终引领技术变革，其软件和服务能够帮助用户实现信息交流和数字生活管理，丰富商务应用和娱乐体验，使个人和企业充分发挥潜力。</p>
<p>经营范围</p>
<p>销售自产产品，批发进口以及国内生产的软件、硬件及外设产品；电脑软件及开发工具、硬件及外设设备的租赁业务；通信设备、移动通信设备、音频和视频设备、电子产品、服装、钟表、手表、眼镜及其上述产品的零配件的批发、佣金代理（拍卖除外）；提供上述产品的售后服务、技术咨询、培训和服务；商业咨询、商业管理咨询。</p>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/361845.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
