您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 利用ATL编写COM组件
VisualC++1第15章利用ATL编写COM组件教学要点本章内容主要包括COM组件与软件复用、ATL与模板的概念,利用Access建立数据库,创建COM组件、使用COM组件。要求了解模板的概念、使用COM组件的方法,熟悉与COM组件有关的概念,掌握利用ATL创建COM组件的方法,熟练掌握在VC中调用自己创建的组件的方法和在别的开发工具如VB中使用VC创建的COM组件的方法。VisualC++2利用ATL编写COM组件本章目录15.1COM组件与ATL15.2利用ATL创建COM组件15.3在VC和VB中使用COM组件习题VisualC++315.1COM组件与ATL本节目录15.1.1COM概述15.1.2COM与软件复用15.1.3与COM有关的概念15.1.4ATL简介VisualC++415.1.1COM概述COM是组件对象模型,在Windows操作系统下COM组件很多,组件是C++面向对象思想在软件业的应用,它是一种创建二进制软件组件的体系,是一种与平台无关、语言无关、分布式的面向对象的体系。它不是一种面向对象的语言,而是一种标准,COM描述了如何创建对象的一个模型以及在COM对象间进行通讯所需要的内容。因此,从功能上讲COM更像一个协议,一个二进制级别上组件重用的协议。VisualC++515.1.2COM与软件复用在软件开发过程中,人们提出软件的制造能否像硬件的生产一样,实现规约化的组装。答案是肯定的,利用Microsoft的COM技术编写的组件就可以达到这个目的。软件复用避免了软件开发过程中的重复劳动的解决方案,其出发点是应用系统的开发不再采用一切“从零开始”的模式,每个COM组件有自己的属性和操作,是一个相对独立运行的实体。从软件复用种类的定义看,COM技术实质上是一种模块复用的情况。采用组件开发软件就像搭积木一样容易,组件单独开发并作为软件模块使用,它具有明确的接口,客户通过这些接口调用组件所能提供的服务,将多种组件拼装起来就能构成大型的组件以至建立整个系统。VisualC++615.1.3与COM有关的概念1.对象对象代表现实中的某个实体,是类的实例。在COM中,对象也是类的实例,但是COM对象与面向对象模型的类对象有区别。COM是与软件开发语言无关、平台无关,而面向对象模型中的类对象在不同的语言下是有区别的。2.接口动态链接库DLL是通过导出一系列函数来让客户程序使用的,只有知道了DLL的导出函数列表才能使用它。COM组件的载体也是一个DLL,COM组件是通过接口与客户进行通讯的,但它是一个抽象类(含有纯虚函数的类)。下面是一个接口的简单定义:VisualC++7与COM有关的概念(2)InterfaceIdeposit:Iunknown{virtualHRESULTGetMoney(int*nMoney)=0;};Iunknown接口很重要,其定义如下:StructIunknown{virtualHRESULTQueryInterface(REFIDiid,void**ppvobj)=0;//查询是否支持接口virtualULONGAddRef()=0;//引用计数加1virtualULONGRelease()=0;//引用计数减1}VisualC++8与COM有关的概念(3)3.类与类工厂类是COM接口的实现,所有的COM对象都是COM类的实例。一个COM类也是用一个GUID来标识,在类中称它为“类标识符”(CLSID:ClassIdentifier)。每个类也有一个字符串名称,叫做“编程标识符”.4.组件组件就是实现了指定接口并被封装在DLL或可执行文件中的软件模块,它能够实现由接口指定的功能,主要用来创建COM对象的。一个组件包括该COM类和实现该类工厂的程序代码,有时也称它为“服务器”。一个组件可以包括多个COM对象,每个COM对象可以实现多个接口。VisualC++9与COM有关的概念(4)5.注册与注册表组件编好之后,编译出来的DLL文件还必须在注册表中注册后才能被其它用户使用。因为只有这样,用户在创建COM对象时,系统才能在注册表中获取相应对象的位置,才能创建对象,对于DLL型的组件,需要调用RegSvr32.exe来完成,对于EXE型的组件,只要服务器运行过一次,该组件就会自动进行注册。返回VisualC++1015.1.4ATL简介ATL(ActiveXTemplateLibrary,活动模板库)是一套C++的模板库,利用它可以很方便地建立小型的、基于COM的组件,对COM组件的开发提供了最大限度的代码自动生成以及可视化的支持。模板是ATL的核心技术。1.什么是模板模板(Template)是基于类型参数产生类和函数的一种机制。模板在不降低类型安全的基础上,可以显著地减少代码量,增加代码的灵活性。模板包括函数模板和类模板,本节只讲类模板。2.类模板类是对问题空间的抽象,而类模板则是对类的抽象,即更高层次上的抽象。使用类模板,可以指定操作于某个数据类型的一族类。在程序中可以首先定义一个类模板,然后通过使用不同的实参生成不同模板类的对象。VisualC++11ATL简介(续)类模板的定义方法为:templateclass类型参数class类名{……};类模板的具体内容与普通类没有本质的区别,只是其员中要用到类模板的类型参数。【例15-1】一个类模板实例。程序的主文件名为MyTemplate.cppVisualC++1215.2利用ATL创建COM组件本节以一个字符串处理的组件为例来阐述如何利用ATL来制作COM组件。编程的思路为:(1)在VC下创建一个ATL工程,并对工程的可选项进行设置;(2)向工程中添加ATL对象,并对该对象进行一些初始配置工作;(3)根据COM组件的功能,向新的ATL对象中加入新的接口定义,包括方法和事件的定义,并实现相应的接口成员函数;(4)编译链接该工程,注册COM组件;(5)编写组件测试程序,验证组件的功能。VisualC++13利用ATL创建COM组件本节目录15.2.1创建ATL应用程序框架15.2.2在工程中添加ATL对象15.2.3在COM组件中添加方法15.2.4ATL中的字符串数据类型15.2.5编译IDL并注册COM组件VisualC++1415.2.1创建ATL应用程序框架1.在VC开发环境下,选择File|New菜单,将弹出的New对话框切换到Projects选项卡后,选择ATLCOMAppWizard项,在Projectname编辑框中输入MyCom工程名称,并设置好工程所在的文件夹。如图右图所示。VisualC++15创建ATL应用程序框架(续)2.单击“OK”按钮,进入图15.2所示的选择ATL组件类型对话框。15.2选择COM组件类型对话框VisualC++16创建ATL应用程序框架(续)ATL组件类型一共有三种:第一种是DLL类型;第二种是EXE类型;第三种是Service类型,它也是一个典型的进程外组件。Service是Windows2000的一种应用服务,当操作系统启动的时候,该Server自动运行。由于进程外组件的执行效率较低,我们选择DLL类型的。选择完后,按“Finish”按钮,结束ATL创建组件的向导生成步骤,最终在磁盘上生成了组件的框架代码。表15.1列出了该工程中的主要文件的信息。VisualC++17表15.1AppWizard生成的MyCom工程中的文件return文件名文件说明MyCom.cpp工程的主文件,其中有组件的接口函数和注册函数MyCom.def工程的DLL模块定义文件,它与前面讲的DLL库中的Def文件的含义相同MyCom.idl工程的接口定义语言文件,COM是靠接口定义语言来定义组件间、组件与客户间的接口定义,它是COM组件的入口点MyCom.rc工程的资源文件,与别的MFC程序的资源文件类似Resouce.h工程的资源文件的头文件,与别的MFC程序的resource.h类似Stdafx.h工程的标准头文件,与别的MFC程序的stdafx.h类似Stdafx.cpp工程的标准实现文件,与别的MFC程序的stdafx.cpp类似Str.rgs工程的注册脚本文件VisualC++1815.2.2在工程中添加ATL对象1.选择Insert|NewATLObject,弹出如图15.3所示的对话框,从Objects列表框中选择SimpleObject项后,单击“Next”按钮继续。图15.3插入一个基于ATL的COM类前面已经创建了一个MyCom工程,接下来,使用VC的ATLObjectWizard工具,可以方便地往工程中添加ATL对象。VisualC++1915.2.2在工程中添加ATL对象(续)2.系统弹出一个ATLObjectWizardProperties对话框。在ShortName中输入Str,在COClass编辑框中输入StrCom,如图15.4所示。注意在Name选项卡中,可以键入类与文件名。默认情况在,ShortName名字是其它名字的词根。可以不接收默认的名字而键入自己的名称。图15.4窗口中的Class是对象所实现的类的名称,CoClass为包含对象支持的一些接口的名称,Interface为对象创建的接口名字,Type为有关注册对象的描述性字符串,ProgID为容器所使用的名字以代替对象的CLSID。图15.4设置COM类的属性VisualC++2015.2.2在工程中添加ATL对象(续)3.切换到图15.5所示的Attribute选项卡,设置StrCom对象的属性,如组件的线程模式、接口类以及是否支持聚集等属性。我们使用系统的默认属性。单击“OK”按钮,就生成了一个StrCom组件对象。图15.5设置组件对象的属性图VisualC++2115.2.3在COM组件中添加方法1.方法的添加进入Workspace窗口的ClassView面板,在IStr接口上右击鼠标,选择AddMethod菜单项后,弹出如图15.6所示的增加方法接口对话框,在MethodName编辑框中输入FirstToUpper,在Parameters编辑框中输入“[in]BSTRInData,[out]BSTR*OutData,[out,retval]long*result”后,按OK按钮结束方法的添加。图15.6添加FirstToUpper方法VisualC++2215.2.3在COM组件中添加方法(续)第一个参数为InData,它是具有“in”属性的字符串变量,它是输入参数,代表欲转换的字符串;第二个参数为outData,它是具有“out”属性的字符串变量,它是输出参数,代表转换完后的的字符串;第三个参数为result,它是具有“out”和“retval”属性,意思是说该参数是作为返回值来用的输出参数,其类型是指向长整型的指针变量。此时用户在ClassView中就可以看到Istr接口中的FirstToUpper的方法。如图15.7所示。图15.7Istr接口的方法FirstToUpperVisualC++2315.2.3在COM组件中添加方法(续)2.方法的实现在Workspace窗口的ClassView面板中,将类CStr展开,接着,再将该类中的Istr接口展开,双击方法FirstToUpper(char*source,char*destion),光标定位到该类的实现文件处,在其中添加代码。STDMETHODIMPCStr::FirstToUpper(BSTRInData,BSTR*OutData,long*result){CComBSTRstrSource=InData;boolbMayUpper=true;//是否可以大写的标志for(inti=0;istrSource.Length();i++){if(strSource[i]='a'&&strSource[i]='z'&&bMayUpper){strSource[i]=strSource[i]-32;bMayU
本文标题:利用ATL编写COM组件
链接地址:https://www.777doc.com/doc-6207726 .html