1.com表示的编编程是什么网站
2.ava中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
3.打网页的时候出来ATL是什么意思?
com表示的是什么网站
简单地说,COM是程源一种跨应用和语言共享二进制代码的方法。与C++不同,编编程它提倡源代码重用。程源ATL便是编编程一个很好的例证。源码级重用虽然好,程源starrtc服务端源码但只能用于C++。编编程它还带来了名字冲突的程源可能,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。编编程
在内存中,程源COM对象的编编程这种标准形式在C++虚函数中偶尔用到,所以这就是程源为什么许多COM代码使用C++的原因。但是编编程记住,编写模块所用的程源语言是无关的,因为结果二进制代码为所有语言可用。编编程
与COM一样,COM+基于二进制组件和基于接口的编程。通过使用透明RPC层,可以跨越进程和计算机边界进行远程方法调用。正如COM组件那样,COM+组件可以在成品中升级和扩展,而不会对使用它们的客户端应用程序造成影响。
ava中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?
的ActiveX
ActiveX的ActiveX起源时,最初只是一个品牌名称,它涵盖了技术不是孤立的,其中大部分是与Internet和Web有一定关联。更重要的是,在ActiveX的整体技术是微软的COM(组件对象模型组件对象模型)的建立。但不要误认为ActiveX是定义了所有包含基于COM的技术。 COM和Microsoft Office和Windows,微软正在做相关的一切,很明显,这些产品是不是ActiveX的家庭成员。
的ActiveX复合文档从微软的技术 - OLE成长起来的。 OLE初始释放,但针对复合文档,但在后续版本OLE2进口COM。 COM的的OLE设计师需求的诞生。其基本出发点是做一个软件,通过一个共同的机构提供服务,另一家软件。因此,COM用户OLE2。事实上,COM和复合文档,是没有多大意义的。后来,COM完全无关的复合文档技术开始得到广泛的应用。因此,微软开始“染指”通用平台技术。 COM是不是一个产品,它需要一个商标名称。不幸的是,市场专家们选择了“OLE”作为商号。然后,利用COM技术的OLE标签粘贴。当然,这些技术的绝大多数具有没有关系与化合物笔。微软为了向人们解释:“OLE不仅是指复合文档!”这是一个相当大的量的能量和时间。
所以,在年的春天,微软改变了主意,选择了ActiveX作为一个新的品牌名称。 ActiveX是一个松散定义的基于COM的技术的集合,OLE仍然仅指复合文档。当然,最重要的核心COM。
对象模型完全独立于编程语言,这是一个非常新颖的想法。从C + +和Java对象,我们将能够理解。但所谓的COM对象是什么就是什么呢?为了便于理解,COM可以看出一些种(软件)封装技术,可以看到它作为一个不同的软件的一部分,结合成某种形式的面向对象的,可以交互的过程和一组支持库。 COM对象可以被写入在C + +,Java中,和VB语言的任何DLL或文件的不同进程的工作的实施。任何语言编写的客户端使用COM对象,而不关注的对象,和不关心它的web页面设计源码DLL,或者到另一个进程来执行。从客户端,没有任何区别。
这样一个共同的处理方法是非常有用的。例如,两个应用程序协调运行的用户,可以合作的一部分,作为COM对象实现(当然,现在可以做的OLE复合文档)之间的相互作用。在浏览器中执行从Web服务器下载的代码,浏览器就可以看到它作为一个COM对象。换句话说,COM技术也是一种打包下载代码的标准方法(ActiveX控件执行此功能)。
甚至是应用程序与本地操作系统交互的方法,您可以使用COM来指定新的API(Windows和Windows NT,多数被定义为一个COM对象)。 COM虽然起源于一个复合文档,但它可以被有效地应用于许多软件问题。
的ActiveX英国
活动平台是微软的世界观。其基本思想是:使用ActiveX控件来建立,包括从组织与用户互动和交易处理监视器,以适应COM的Web服务器,所有的自动。活动平台包括两部分:活动服务器和活动的客户端。
活动服务器的中间层。组件或Active Server Pages,为客户提供业务逻辑和应用处理的地方。 ActiveServer技术的核心NT Server,Microsoft事务服务器,数据管理服务,目录服务,Web服务,以及网络服务。
交易服务器是微软的基于组件的编程模型,结合了传统的TP多个线程生成和数据库监控功能。其他组件的数据管理服务,如主动OLE DB和ODBC访问DB2,甲骨文,SQL Server和其他数据源。目录服务提供目录服务层,使在网络上的远程对象的相互四处搜寻DCOM(分布式COM,分布式COM)。 Inter网服务器为中心的Web服务建立在Web服务器上,应用程序的开发,生成脚本(脚本)的机构。通过中介网络为中心的网络服务,DCOM建立MS-RPC同步,这样一来就能连接的控制。
活跃的客户端是一个跨平台的。微软的技术,即使排斥,但也希望,这项技术是开放的多个操作系统。该计划的具体实施是使用脚本引擎(脚本引擎)。脚本引擎是一个标准的HTML和Java虚拟机(JVM)与微软特色,微软的VBScript司法人员叙用委员会RIPT的构成。组装到微软的IE 3.0和4.0的ActiveX,可以成为活跃的客户端的C / S
从企业用户只使用Windows的Active平台可以提供一个强大的,可扩展的服务器应用程序开发平台的应用程序的一部分。 ActiveServer的TP监视器高端产品这样的场合,使用常见的工具和技术。因此,小型工作组和内联网应用程序将无法超越的Active Server的能力。 ACTI VE的目标平台是一个异构的环境,但由于过度依赖IE,所以你不能开车到客户端。虽然一些非Windows平台上也推出了浏览器,但最好的支持,最新版本的资源管理器或窗口s。
的ActiveX进步
COM扩展初始版本的分布式计算,假设COM对象和它的客户端运行在同一台机器(在同一个进程,而且在不同的进程),DCOM的的ActiveX家庭成员。后来,它可以使用在Windows 中。 COM对象的DCOM客户端交互不能做任何。
客户端使用完全相同的代码可以访问本地和远程对象。然而,很多情况下,客户需要的一些DCOM附件。 DCOM提供分布式的安全保密机制,以提供验证和数据加密。顶帖平台源码发布于年,是Windows NT 5.0,Kerberos等安全保密协议,追加到DCOM。 DCOM已经能够使用简洁的域名服务,目录服务,搜索其他计算机上的COM对象。 NT 5.0支持更多的的ACTI已经指南。 Active Directory的域名服务和轻量级目录访问协议的基础上。
DCOM的对手,一直是OMG(对象管理组织)的CORBA(公共对象R equest代理体系结构)。它被组装成IONA的Orbix和Visigenic的VisiBroker和其他产品。不久前,另一位技术支持分散的对象 - Java远程方法调用介绍。两个C ORBA,DCOM,可以在多语言写对象之间的通信。 RMI只限于Java实现对象之间的通信。很显然,这是一个制约因素。 RMI是非常简单的使用。 RMI开发人员可以使用Java来设计的协议规范。因此,在语言的功能,可以进行无缝的。
写一个的DCOM服务器处理只有两三个客户端,是相当简单的。然而,建立一个高效的处理数百成千上万的客户端DCOM服务器,相当困难。
为了便于编写可扩展的DCOM服务器,微软事务服务器(MTS)。在支持该交易的同时,MTS自动生成的线索和重复使用的智能对象。 MTS可伸缩的服务器的生产变得相当简单。即使没有事务处理应用程序,使用MTS也不错。事实上,M icrosoft鼓励人们使用VB写的MTS应用程序。这是发展业务服务器的传统做法不同,所有MTS应用程序的COM对象写入一个以上的,而且必须实现的一个DLL。在正常情况下,客户端将无法看到MTS。客户端只是继续生产,使用COM对象可以是。
标准化组件的
基于组件的应用程序的开发,组装电子设备,你可以使用现成的零部件来构建应用程序。桌面使用的ActiveX控件,基于COM的组件。所谓的ActiveX控件,但要符合一定的标准,COM对象进行交互的客户端。
例如,ActiveX控件,必须通过自动化(调度接口)来公开方法。这种标准化的交互功能,可以使用在一个数量不同的情况下,相同的控制。 “幕后”这个标准接口,ActiveX控件是几乎能胜任。现在,许多软件公司都能够控制各种功能。
ActiveX控件的DDL的准备,为此,它必须被加载到一个容器中。 ActiveX控件容器VB原型,此外,也有多种选择的容器。目前,一个非常重要的控制容器是微软的网络浏览器
那些元素的所谓的ActiveX控件,它是要实现的许多方法。他们已经从本地硬盘的机器VB和其他容器。数百KB和MB管制的,似乎没有什么大的区别。但是当你想控制被加载到Web浏览器,它很可能是通过电话线速度非常缓慢。现在,该大小的控制是非常关键的问题。要进行控制,超过一定限度,1314表白墙源码就会延长下载时间。因此,Microsoft提供了ActiveX控件,只有在绝对必要的功能。
苹果公司和IBM公司推出的OpenDoc,是主要竞争对手的ActiveX控件。的OpenDoc赞助的企业现在已正式宣布暂停经济援助。与微软的企业青睐JavaBeans(J ava的基于组件的结构)的对抗。基本上是捆绑的ActiveX控件和Windows,在二进制机器代码,而JavaBeans是不同的,它是能够执行。这,当然是有代价的。很明显,只要不牺牲便携性,它是不可能完全彻底利用当地的环境。要编写的组件可以从公共互联网上下载的,应优先考虑选择JavaBeans的。
桌面组件市场的持续快速增长。其中大部分是基于ActiveX控件的建立(Java Beans的仍是少数)。服务器组件的标准化落后。在桌面上,VB,PowerBuilder编程环境,容器,Web浏览器是强大的。如果在服务器容器是必须要做的吗?集装箱的服务器组件事务服务器是一个更好的选择。
微软的竞争对手,并尽一切可能防止MTS和NT占领市场。他们是在全速发展标准的服务器组件,其中一个最有前途的是对En?terprise JavaBeans。 JavaBeans的扩张,并定义了一个事务处理服务器接口。 Enterprise JavaBeans的支持者,独立软件供应商,作为一个COM组件来写,但写豆类的服务器组件。
ActiveX构建工具的
推广的ActiveX控件,ActiveX控件的开发工具是与日俱增。由于ActiveX是不依赖于语言,传统的开发工具基本上可以建立的ActiveX控件。最常用的Delphi,宝werBuilder以及Visual Basic中的Visual C + +时,Visual J + +等。基本配置文件
1。 ActiveX控件的3GL开发:①MFC(微软基础类,Microsoft基础类),②ActiveX模板库,ActiveX模板库(ATL),③BaseCtrl的框架等。 MFC是最经典的,使用MFC开发人员不关心的接口,而是将注意力集中在对象的动作。它的缺点是必须存在的控制和执行DLL与容器的尺寸就越大。 ATL可以使用模板来生成代码。也就是说,图书馆和DLL没有一起推出的控制。在ATL中,你需要一些基本的派生类从现有的模板。 AT L也有缺点,即该接口的处理是困难的,该应用程序的必要的接口,必须创建。此外,ATL不支持的类向导,类向导。不幸的是,没有对象描述语言(对象描述语言)和接口定义语言文件,自动同步用户代码向导。 BaseCtrl是一?个简单的类型库。 ATL是非常相似,但没有模板。事实上,由于BaseCtrl太容易了,微软不支持它。在BaseCtrl中,一些无所不能的控制(骨架控制)。该ActiveX的发展模式BaseCtrl提供容易理解的,但与ATL并不简单,是不是和ATL和灵活性。现在看来,黑马财富app源码ActiveX控件的开发人员,BaseCt RL是“苦”的选择。
2。开发工具
ActiveX控件可以,第一个工具的Microsoft Visual C + +。它可以提供最大程度的控制ActiveX开发。的Visual J + +和ActiveX控件也可以。
Borland公司推出了两款工具(JBuilder和IntraBuilder),也是很可观的。然而,BORL和工具创建ActiveX组件,只有德尔福3.0和C + + Builder中。 Borland的Delphi的A ctiveX发展的特点,被称为内有效。它是任意的Delphi窗口的形式的ActiveX。活跃?在配备了新的控件在Web上。 Delphi控件COM和DCOM的链接。
PowerBuilder的5.0转化为可用于开发的ActiveX客户端/服务器开发工具。作为一个ActiveX控件,可配鲍威的rBuilder数据窗口(PowerBuilder应用开发的核心部分)。为了使PowerBuilder开发人员现在可以使用的PowerScript编程语言,一些熟悉的功能。
拥有最好的工具,使ActivX控件,无疑是微软。例如,使用Visual Basic 5.0中,开发人员可以使用可视化编程环境和本地语言Visual Basic应用开发控制。
5的ActiveX
事实上,Windows和Windows NT,ActiveX技术环境的世界。但无论MICR OSOFT以及如何推进它的操作系统,也不能所有的企业已成为所有Windows。 ,MICROS经常要尽量使COM,DCOM和ActiveX家庭的一部分,也可以使用其他OS。 Macin胡说已经支持ActiveX,这其中也包括对ActiveX控件的支持。 Software AG的这些技术被移植到多种Unix和IBM的OS/。 DEC和HP还打算在自己的系统中使用这些技术,他们也是微软的源代码移植的方式来实现。
COM的Windows 和Windows NT环境为基础的软件已成为一个重要组成部分,但它是未来,有很多不确定因素。例如,微软是作为一个多平台的技术,能够COM开发允许继续存在呢?按企业现有的NT服务器,有必要使DCOM的分布式服务,也可以应用在非微软平台上。为了解决这些问题,它需要相当长的一段时间。基于CORBA的产品,和JAV一个RMI已经成功地运行在多操作系统环境。后期推出的多平台,DCOM,CORBA和RMI领先?的多。
ActiveX控件和JavaBeans竞争力的前景?无论在Web浏览器或运行在另一个地方运行的软件,或在短的,组件的软件(构件的)是一种软件开发的热点。目前,ActiveX控件,暂时处于领先地位,但由于的OpenDoc的运行过程,与微软的企业竞争成为了一个与之抗衡的。用户再也不想看到“独霸天下”,仅仅这一点的,JavaBean将在此的市场竞争中抢占一席之地。
打网页的时候出来ATL是什么意思?
ATL,Active Template Library活动模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。通过活动模板库,可以建立COM组件,然后通过ASP页面中的脚本对COM对象进行调用。这种COM组件可以包含属性页、对话框等等控件。
ATL简介
一. 什么是ATL
自从年Microsoft首次公布了COM技术以后,Windows平台上的开发模式发生了巨大的变化,以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大的开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时,对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术,令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具,提高开发效率,更好地利用这项技术。
针对这种情况,Microsoft公司在推出COM SDK以后,为简化COM编程,提高开发效率,采取了许多方案,特别是在MFC(Microsoft Foundation Class)中加入了对COM和OLE的支持。但是随着Internet的发展,分布式的组件技术要求COM组件能够在网络上传输,而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求,因此Microsoft在年又推出了一种全新的COM开发工具ATL。
ATL是ActiveX Template Library 的缩写,它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码(Effective and Slim code),同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。为了方便使用,从Microsoft Visual C++ 5.0版本开始,Microsoft把ATL集成到Visual C++开发环境中。年9月推出的Visual Studio 6.0 集成了ATL 3.0版本。目前,ATL已经成为Microsoft标准开发工具中的一个重要成员,日益受到C++开发人员的重视。
ATL究竟给开发人员带来了什么样的益处呢?这还要先从ATL产生以前的COM开发方式说起。
在ATL产生以前,开发COM组件的方法主要有两种:一是使用COM SDK直接开发COM组件,另一种方式是通过MFC提供的COM支持来实现。
直接使用COM SDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包,我们可以直接编写COM程序。但是,这种开发方式的难度和工作量都很大,一方面,要求开发者对于COM的技术原理具有比较深入的了解(虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的,但对于COM这样一整套复杂的技术而言,在短时间内完全掌握是很难的),另一方面,直接使用COM SDK要求开发人员自己去实现COM应用的每一个细节,完成大量的重复性工作。这样做的结果是,不仅降低了工作效率,同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要,但这种编程方式并不符合组件化程序设计方法所倡导的可重用性,因此,直接采用COM SDK不是一种理想的开发方式。
使用MFC提供的COM支持开发COM应用可以说在使用COM SDK基础上提高了自动化程度,缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中,开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性,MFC中有许多预定义宏,这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。
另外,在MFC中还提供对Automation 和 ActiveX Control的支持,对于这两个方面,Visual C++也提供了相应的AppWizard和ClassWizard支持,这种可视化的工具更加方便了COM应用的开发。
MFC对COM和OLE 的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持是不够完善和彻底的,例如对COM接口定义的IDL语言,MFC并没有任何支持,此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装,自然要涉及Windows编程的方方面面,COM作为Windows平台编程开发的一个部分也得到MFC的支持,但是MFC对COM的支持是以其全局目标为出发点的,因此对COM 的支持必然要服从其全局目标。从这个方面而言,MFC对COM的支持不能很好的满足开发者的要求。
随着Internet技术的发展,Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广,然而使用MFC开发的ActiveX Control,代码冗余量大(所谓的“肥代码 Fat Code”),而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关,但是由于MFC的继承实现的本质,ActiveX Control必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式,这将使ActiveX Control代码过于庞大,在网络上传输时将占据宝贵的网络带宽资源;如果采用动态连接MFC运行时刻库的方式,这将要求浏览器一方必须具备MFC的运行时刻库支持。总之MFC对COM技术的支持在网络应用的环境下也显得很不灵活。
解决上述COM开发方法中的问题正是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的使用和基本原理有一个初步的了解,为广大的COM开发人员更好地使用ATL开发起到抛砖引玉的作用。
二. 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对象)的方式,对象是类的实例,而模板类定义的是类的构造方式,使用模板类定义实例化的结果产生的是不同的类。因此可以说模板类是“类的类”。
在C++语言中模板类的定义格式如下:
注意:<和>是左右尖括号,可能无法正常显示。
template < class T>
class MyTemp
{
MyTemp<T>( ){ };
~MyTemp<T>( ) { };
int MyFunc( int a) ;
}
………….
Int MyTemp<T>::MyFunc( int a)
{
}
首先使用C++的关键字“template”来声明一个模板类的定义。在关键字后面是用尖括号括起来的类型参数。正是根据这个类型参数,编译器才能在编译过程中将模板类的具体定义转化为一个实际的类的定义,即生成一个新的类。接下来的定义方式与普通的类定义十分相似,只是在类的函数定义中都要带有类型参数的说明。
下面的程序段说明了模板类的用法:
typedef MyTemp<MyClass> myclassfromtemp;
myclassfromtemp m;
int a = m.Myfunc();
通常在使用模板类时为了方便起见,使用一个关键字“typedef”为新定义出来的类取一个名字。在上面的程序段中假设“MyClass”是一个由用户定义的类,通过将这个类的名字作为类型参数传递给模板类,我们可以创建一个新的类,这个类的行为将以模板类的定义为基础,例如它具有模板类定义的所有成员函数,同时这个类又是对模板类行为的一种修改,这种修改是通过用户提供的类型参数来实现的。赋予模板类以不同的类型参数,则得到行为框架相似但具体行为不同的一组类的集合。有了新的类的定义以后,我们可以象使用普通类一样来创建一个类的实例,即一个新的对象,并且调用这个对象的成员函数。
模板类是对标准C++语言的最新扩展,虽然它的功能很强大,但是要想使用好模板类需要相当多的关于语言和编程的经验和知识,而且错误地使用模板类又会对程序的结构和运行效率带来大的副作用,因此一般的编程环境和编程书籍对模板类的使用都采取谨慎的态度。而ATL的核心就是由几十个模板类构成的,通过研究ATL的源代码可以使我们对模板类的使用有比较深刻全面的认识。
多继承技术同模板一样,是C++语言中极具争议性的技术。使用多继承技术可以使程序的设计和实现更加灵活,但是,由于多继承的复杂性和自身概念上的一些问题,使多继承在各种面向对象的语言环境中得到的支持都非常有限。例如Small Talk根本就不允许多继承,同样MFC也不支持多继承技术。
多继承最大的问题是所谓的“钻石结构”。例如下面的代码:
class A
{
.....
};
class B : public A
{
.. .
};
class C : public A
{
.....
};
class D : public C,B
{
........
}
由于类D同时从类C和B继承,因此在下面的语句中就会发生歧义:
D* pD = new D;
(A*)pD->Func(...);
由于类D通过类C和类B 分别继承了类A,这里的强制转化就会发生歧义。
ATL使用了C++最新规范中加入的两个运算符号 static_cast、dynamic_cast代替简单的强制转化,从而消除多继承带来的歧义。使用这两个运算符号,我们可以在对象运行过程中获取对象的类型信息。上面的代码可以采用下面的方式修改:
D* pD = new D;
static_cast<A*>(static_cast<B*>(pD))->Func(...);
为什么模板类和多继承技术会成为ATL主要的工具呢?原因在于,采用模板可以在编译过程中快速的生成具有用户定制功能的类,这对于COM这样一个复杂的技术体系在实现效率上得到了很大的提高。通过使用模板类,用户可以把精力集中在自己开发的类的基本逻辑上,在完成了自己的类的设计以后,通过继承不同的类,生成不同的模板类,就可以快速地实现COM的功能,同时又避免了采用单继承结构造成的大量功能冗余。
总之,正是由于在设计实现过程中采用了模板类和多继承技术,才使ATL成为一个小巧灵活的COM开发工具,能够适应开发人员对COM应用开发的各种需要。
三. ATL基本使用
这一部分将重点介绍ATL的基本使用过程。由于ATL已经被集成在Microsoft Visulal Studio的Visual C++开发环境中,因此要使用ATL必须先安装Visual C++。在下面的讨论中有关COM的基本知识请参阅有关的文档,这里不再详细说明。给出的图是在Microsoft Windows 平台下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类的接口中加入成员函数的定义,以及接口成员函数的实现过程。
3. 加入接口定义,实现接口函数
加入了ATL类定义之后,我们可以打开Visual C++集成环境下项目管理器(Workspace)中的Class View来检查生成的类定义的情况。我们可以看到一个新的类已经生成,同时,还生成了相应的接口定义。ATL Object Wizard为我们生成了类定义的.h 和.cpp文件,此外还有用于接口定义的IDL文件。有了这些文件以后,我们就可以为接口加入成员函数,完成类的定义。
首先在Class View中选中相应的接口,显示为接口IATLTest,单击鼠标右键打开菜单,如图7。此弹出式菜单定义了为接口加入属性和方法的操作。选取其中的“Add Method...”项,可以为接口加入方法成员;选取“Add Property...”则可以为接口加入新的属性成员。
4. 编译连接应用、注册COM服务程序
对ATL工程的编译连接过程包括下面的几个步骤:
使用MIDL编译工程的IDL文件,形成接口定义的头文件和用于调度(Marshalling)的代码;
编译工程的.cpp文件形成目标文件;
连接目标文件,形成应用模块;
注册COM服务程序。
关于工程编译连接的其它部分同Visual C++中MFC工程的编译连接过程相似,这里只重点介绍一下COM服务程序的注册过程。
在ATL中,COM服务程序的注册是在工程编译连接的最后阶段,由ATL辅助完成的。在手工的COM编程中,服务程序的注册是比较麻烦的工作。在ATL中,系统通过读取在建立工程过程中形成的注册脚本文件来完成注册工作。注册脚本(Register Script 简称RGS)是ATL提供的文本方式的注册辅助文件。下面是注册脚本文件的一个实例。
HKCR - 表示注册表中COM对象的注册项,是HKEY_CLASS_ROOT的缩写
{
AuthTest.ActiveXObject.1 = s 'ActiveXObject Class'
{
CLSID = s ''
} - 对象的ProgID
AuthTest.ActiveXObject = s 'ActiveXObject Class'
{
CLSID = s ''
} -对象的与版本无关的ProgID
NoRemove CLSID -对象CLSID注册项
{
ForceRemove = s 'ActiveXObject Class'
{
ProgID = s 'AuthTest.ActiveXObject.1'
VersionIndependentProgID = s 'AuthTest.ActiveXObject'
InprocServer = s '%MODULE% -服务器类型,表示DLL服务器
{
val ThreadingModel = s 'both' -线程模型,这里是BOTH型
}
}
}
}
RGS文件包含注册COM服务程序的各项内容,通常我们不必修改此RGS文件,必要时我们也可以手工修改RGS文件来定制模块的注册过程。
四. 应用ATL的一个例子
上面介绍了使用ATL创建一个COM服务程序的基本过程。在介绍过程中,我们实际上已经生成了一个COM服务程序的基本框架,只是没有填写实际的内容。在下面部分,我们实际开发一个十分简单的COM服务程序,并且为它编写一段客户代码进行测试,使大家对使用ATL开发COM服务程序的过程有一个全面整体的了解。
我们要开发的服务程序的功能很简单,它只实现一个接口,这个接口名字是ISimpleInterface,接口只有一个成员函数,叫做Welcome。这个函数的功能只是输出一个“Hello World!”的字符串。
按照上一部分介绍的创建COM服务程序的步骤,我们进行如下的操作:
1 打开Visual C++集成开发环境;
2 创建一个称为SimpleTest的ATL工程;
3 在这个工程中插入新的对象,对象的名字是SimpleInterface;
4 设置接口ISimpleInterface的有关属性,使它成为一个双接口;
5 在对象的接口ISimpleInterface中加入方法Welcome;
6 打开ATL加入的Welcome方法的框架,可以看到如下的代码段:
STDMETHODIMP CActiveXObject::get_TestProp(long *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
return S_OK;
}
7 将程序框架中的注释部分替换为下面的代码:
::MessageBox(NULL,_T(”Hello World!”),_T(”Welcome”), MB_OK);
Welcome方法被调用时将弹出一个消息框。
8 编译连接工程。
上面的步骤完成以后,我们就有了一个简单的COM服务程序,而且已经被注册到当前系统中。
下面我们要完成一个简单的COM客户程序。一个COM客户程序简单地说是使用COM组件对象的程序。客户程序调用COM对象的基本流程是:
创建COM对象的实例。这可以通过调用Windows系统的API函数CoCreateInstance来完成。
通过接口调用函数。
调用IUnknown::Release释放COM对象实例
我们的客户程序是使用MFC编写的一个基于对话框的简单应用程序。具体的过程如下:
1 打开Visual C++集成开发环境;
创建一个称为SimpleClient的基于对话框的MFC工程;
在对话框中加入一个按钮,名字为TEST;
在SimpleClient.cpp文件中加入如下的代码:
(1) 在cpp文件 #include “simpleclientdlg.h”之后加入下面的代码:
#include “d:\simpletest\simpletest_i.h” // 根据需要修改头文件的路径
加入的头文件是在编译COM服务程序过程中自动生成的,其中包含接口本身的定义、接口IID的定义和COM对象的CLSID的定义。包含该头文件可以使客户程序能够使用COM服务程序。
(2) 在按钮TEST的消息控制函数中加入如下的代码:
HRESULT hr;
ISimpleInterface* pIntf = NULL;
hr = CoCreateInstance(CLSID_SimpleInterface, NULL, CLSCTX_SERVER ,
IID_ISimpleInterface, (void **)& pIntf);
if(SUCCEEDED(hr))
{
pIntf->Welcome();
pIntf->Release();
}
上面的代码首先通过系统API CoCreateInstance创建COM对象,得到接口的指针,然后调用接口成员函数Welcome,最后通过IUnknown::Release()函数释放COM对象实例。