书签 分享 收藏 举报 版权申诉 / 44
上传文档赚钱

类型利用ATL编写COM组件课件.ppt

  • 上传人(卖家):三亚风情
  • 文档编号:2920910
  • 上传时间:2022-06-11
  • 格式:PPT
  • 页数:44
  • 大小:1.25MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《利用ATL编写COM组件课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    利用 ATL 编写 COM 组件 课件
    资源描述:

    1、Visual C+Visual C+1利用利用ATLATL编写编写COMCOM组件组件1COM组件与ATL2利用ATL创建COM组件 3在VC和VB中使用COM组件 Visual C+Visual C+21 1COMCOM组件与组件与ATLATL目录1.1COM概述 1.2COM与软件复用 1.3与COM有关的概念1.4ATL简介 Visual C+Visual C+31.11.1 COMCOM概述概述 COM是组件对象模型,在Windows操作系统下COM组件很多,组件是C+面向对象思想在软件业的应用,它是一种创建二进制软件组件的体系,是一种与平台无关、语言无关、分布式的面向对象的体系。它不

    2、是一种面向对象的语言,而是一种标准,COM描述了如何创建对象的一个模型以及在COM对象间进行通讯所需要的内容。因此,从功能上讲COM更像一个协议,一个二进制级别上组件重用的协议。 Visual C+Visual C+4 1.2 1.2 COMCOM与软件复用与软件复用 在软件开发过程中,人们提出软件的制造能否像硬件的生产一样,实现规约化的组装。答案是肯定的,利用Microsoft的COM技术编写的组件就可以达到这个目的。 软件复用避免了软件开发过程中的重复劳动的解决方案,其出发点是应用系统的开发不再采用一切“从零开始”的模式,每个COM组件有自己的属性和操作,是一个相对独立运行的实体。从软件复

    3、用种类的定义看,COM技术实质上是一种模块复用的情况。采用组件开发软件就像搭积木一样容易,组件单独开发并作为软件模块使用,它具有明确的接口,客户通过这些接口调用组件所能提供的服务,将多种组件拼装起来就能构成大型的组件以至建立整个系统。Visual C+Visual C+51.31.3 与与COMCOM有关的概念有关的概念 1对象 对象代表现实中的某个实体,是类的实例。在COM中,对象也是类的实例,但是COM对象与面向对象模型的类对象有区别。COM是与软件开发语言无关、平台无关,而面向对象模型中的类对象在不同的语言下是有区别的。2接口 动态链接库DLL是通过导出一系列函数来让客户程序使用的,只有

    4、知道了DLL的导出函数列表才能使用它。COM组件的载体也是一个DLL,COM组件是通过接口与客户进行通讯的,但它是一个抽象类(含有纯虚函数的类)。下面是一个接口的简单定义:Visual C+Visual C+6与与COMCOM有关的概念有关的概念(2(2) )Interface Ideposit:Iunknownvirtual HRESULT GetMoney(int *nMoney)=0;Iunknown接口很重要,其定义如下:Struct Iunknownvirtual HRESULT QueryInterface(REFID iid,void * * ppvobj)=0; /查询是否支持

    5、接口virtual ULONG AddRef()=0; /引用计数加1virtual ULONG Release()=0; /引用计数减1Visual C+Visual C+7与与COMCOM有关的概念有关的概念(3 3)3类与类工厂 类是COM接口的实现,所有的COM对象都是COM类的实例。一个COM类也是用一个GUID来标识,在类中称它为“类标识符”(CLSID:Class Identifier)。每个类也有一个字符串名称,叫做“编程标识符”.4组件 组件就是实现了指定接口并被封装在DLL或可执行文件中的软件模块,它能够实现由接口指定的功能,主要用来创建COM对象的。一个组件包括该COM类

    6、和实现该类工厂的程序代码,有时也称它为“服务器”。一个组件可以包括多个COM对象,每个COM对象可以实现多个接口。 Visual C+Visual C+8与与COMCOM有关的概念有关的概念(4 4) 5注册与注册表 组件编好之后,编译出来的DLL文件还必须在注册表中注册后才能被其它用户使用。因为只有这样,用户在创建COM对象时,系统才能在注册表中获取相应对象的位置,才能创建对 象 , 对 于 D L L 型 的 组 件 , 需 要 调 用RegSvr32.exe来完成,对于EXE型的组件,只要服务器运行过一次,该组件就会自动进行注册。返回 Visual C+Visual C+91.41.4

    7、ATLATL简介简介 ATL(ActiveX Template Library,活动模板库)是一套C+的模板库,利用它可以很方便地建立小型的、基于COM的组件,对COM组件的开发提供了最大限度的代码自动生成以及可视化的支持。模板是ATL的核心技术。 1什么是模板 模板(Template)是基于类型参数产生类和函数的一种机制。模板在不降低类型安全的基础上,可以显著地减少代码量,增加代码的灵活性。模板包括函数模板和类模板,本节只讲类模板。 2类模板 类是对问题空间的抽象,而类模板则是对类的抽象,即更高层次上的抽象。使用类模板,可以指定操作于某个数据类型的一族类。在程序中,可以首先定义一个类模板,然

    8、后通过使用不同的实参生成不同模板类的对象。Visual C+Visual C+10ATLATL简介简介(续)(续) 类模板的定义方法为: template class 类名 ; 类模板的具体内容与普通类没有本质的区别,只是其员中要用到类模板的类型参数。 【例15-1】一个类模板实例。程序的主文件名为MyTemplate.cpp。Visual C+Visual C+112 2利用利用ATLATL创建创建COMCOM组件组件本节以一个字符串处理的组件为例来阐述如何利用ATL来制作COM组件。编程的思路为:(1)在VC下创建一个ATL工程,并对工程的可选项进行设置;(2)向工程中添加ATL对象,并对

    9、该对象进行一些初始配置工作;(3)根据COM组件的功能,向新的ATL对象中加入新的接口定义,包括方法和事件的定义,并实现相应的接口成员函数;(4)编译链接该工程,注册COM组件;(5)编写组件测试程序,验证组件的功能。Visual C+Visual C+12利用利用ATLATL创建创建COMCOM组件组件目录目录2.1创建ATL应用程序框架 2.2在工程中添加ATL对象 2.3在COM组件中添加方法2.4ATL中的字符串数据类型 2.5编译IDL并注册COM组件 Visual C+Visual C+132.12.1 创建创建ATLATL应用程序框架应用程序框架 1在VC开发环境下,选择File

    10、|New菜单,将弹出的New对话框切换到Projects选项卡后,选择ATL COM AppWizard项,在Project name编辑框中输入MyCom工程名称,并设置好工程所在的文件夹。如图右图所示。 Visual C+Visual C+14创建创建ATLATL应用程序框架(应用程序框架(续)续) 2 单 击“OK”按钮,进入图2所示 的 选 择ATL组件类型对话框。 2 选择选择COM组件类型对话框组件类型对话框Visual C+Visual C+15创建创建ATLATL应用程序框架应用程序框架(续)(续)ATL组件类型一共有三种:第一种是DLL类型;第二种是EXE类型;第三种是Ser

    11、vice类型,它也是一个典型的进程外组件。Service是Windows2000的一种应用服务,当操作系统启动的时候,该Server自动运行。 由于进程外组件的执行效率较低,我们选择DLL类型的。选择完后,按“Finish”按钮,结束ATL创建组件的向导生成步骤,最终在磁盘上生成了组件的框架代码。表1列出了该工程中的主要文件的信息。Visual C+Visual C+16表表1 AppWizard生成的生成的MyCom工程中的文工程中的文件件 return文件名文件名文件说明文件说明MyCom.cpp工程的主文件,其中有组件的接口函数和注册函数工程的主文件,其中有组件的接口函数和注册函数MyC

    12、om.def工程的工程的DLL模块定义文件,它与前面讲的模块定义文件,它与前面讲的DLL库中的库中的Def文文件的含义相同件的含义相同MyCom.idl工程的接口定义语言文件,工程的接口定义语言文件,COM是靠接口定义语言来定义是靠接口定义语言来定义组件间、组件与客户间的接口定义,它是组件间、组件与客户间的接口定义,它是COM组件的入口组件的入口点点MyCom.rc工程的资源文件,与别的工程的资源文件,与别的MFC程序的资源文件类似程序的资源文件类似Resouce.h工程的资源文件的头文件,与别的工程的资源文件的头文件,与别的MFC程序的程序的resource.h类似类似Stdafx.h工程的

    13、标准头文件,与别的工程的标准头文件,与别的MFC程序的程序的stdafx.h类似类似Stdafx.cpp工程的标准实现文件,与别的工程的标准实现文件,与别的MFC程序的程序的stdafx.cpp类似类似Str.rgs工程的注册脚本文件工程的注册脚本文件Visual C+Visual C+172.22.2 在工程中添加在工程中添加ATLATL对象对象 1.选择Insert|New ATL Object,弹出如图3所示的对话框,从Objects列表框中选择Simple Object项后,单击“Next”按钮继续。图图3插入一个基于插入一个基于ATL的的COM类类 前面已经创建了一个前面已经创建了一

    14、个MyCom工程,接下来,使用工程,接下来,使用VC的的ATL Object Wizard工具,可以方便地往工程中添加工具,可以方便地往工程中添加ATL对象对象。Visual C+Visual C+182.22.2 在工程中添加在工程中添加ATLATL对象对象( (续续) ) 2 系 统 弹 出 一 个 A T L Object Wizard Properties对话框。在Short Name中输入Str,在COClass编辑框中输入StrCom,如图4所示。 注意在Name选项卡中,可以键入类与文件名。默认情况在,Short Name名字是其它名字的词根。可以不接收默认的名字而键入自己的名称

    15、。 图4窗口中的Class是对象所实现的类的名称,CoClass为包含对象支持的一些接口的名称,Interface为对象创建的接口名字,Type为有关注册对象的描述性字符串,Prog ID为容器所使用的名字以代替对象的CLSID。 图图4 4 设置设置COMCOM类的属性类的属性Visual C+Visual C+192.22.2 在工程中添加在工程中添加ATLATL对象对象( (续续) ) 3切换到图5所示的Attribute选项卡,设置StrCom对象的属性,如组件的线程模式、接口类以及是否支持聚集等属性。我们使用系统的默认属性。单击“OK”按钮,就生成了一个StrCom组件对象。图图5

    16、设置组件对象的属性图设置组件对象的属性图 Visual C+Visual C+202.32.3 在在COMCOM组件中添加方法组件中添加方法 1方法的添加 进入Workspace窗口的ClassView面板,在IStr接口上右击鼠标,选择Add Method菜单项后,弹出如图6所示的增加方法接口对话框,在Method Name编辑框中输入FirstToUpper,在Parameters编辑框中输入“in BSTR InData,outBSTR * OutData,out,retvallong *result”后,按OK按钮结束方法的添加。 图图 6 添加添加FirstToUpper方法方法Vi

    17、sual C+Visual C+212.32.3 在在COMCOM组件中添加方法组件中添加方法(续)(续) 第一个参数为InData,它是具有“in”属性的字符串变量,它是输入参数,代表欲转换的字符串;第二个参数为outData,它是具有“out”属性的字符串变量,它是输出参数,代表转换完后的的字符串;第三个参数为result,它是具有“out”和“retval”属性,意思是说该参数是作为返回值来用的输出参数,其类型是指向长整型的指针变量。 此时用户在ClassView中就可以看到Istr接口中的FirstToUpper的方法。如图7所示。 图图7 Istr接口的方法接口的方法FirstToU

    18、pper Visual C+Visual C+222.32.3 在在COMCOM组件中添加方法组件中添加方法(续)(续) 2方法的实现 在Workspace窗口的ClassView面板中,将类CStr展开,接着,再将该类中的Istr接口展开,双击方法FirstToUpper(char *source, char *destion),光标定位到该类的实现文件处,在其中添加代码。STDMETHODIMP CStr:FirstToUpper(BSTR InData, BSTR *OutData, long *result)CComBSTR strSource=InData; bool bMayUpp

    19、er=true; /是否可以大写的标志for(int i=0;i=a&strSourceiFirstToUpper(str); SysFreeString(str);Visual C+Visual C+252.42.4 ATLATL中的字符串数据类型中的字符串数据类型(续)(续) 2CComBSTR CComBSTR是ATL封装的一个来使用BSTR数据类型的类,如果把BSTR看作各种语言都可以使用的共同数据类型的话,那么CComBSTR则就是在C+下操纵COM中的一个数据类型。 CComBSTR类中有一些重要的函数,如Append()(增加一个字符串),AppendBSTR()(增加一个BST

    20、R字符串),Copy()(返回成员变量m_str的值),Empty()(释放成员变量m_str的值),Length()(返回BSTR的长度)等。 Visual C+Visual C+262.52.5 编译编译IDLIDL并注册并注册COMCOM组件组件 1IDL简介 COM接口通常用“接口定义语言”IDL来定义,IDL是一种类似于C+的语言,前一节设计了一个MyCom组件,下面是其接口MyCom.idl的内容: 2编译IDL 上述Mycom.idl文件我们并未编写,这完全归功于ATL工具,是它帮助我们自动完成了IDL接口文件。前面在给组件中添加方法的过程中,向导自动完成了IDL文件。 切换到W

    21、orkSpace的FileView面板中,在MyCom.idl文件上右键单击鼠标,选择Compile MyCom.idl菜单项,于是在磁盘上生成了接口定义文件对应的二进制文件Mycom.tlb。该文件中含有接口中所定义的方法的记录,定义了组件的虚函数指针表。.tlb可以看作是二进制的接口定义语言。Visual C+Visual C+272.52.5 编译编译IDLIDL并注册并注册COMCOM组件组件(续)(续)/ MyCom.idl : IDL source for MyCom.dll/ This file will be processed by the MIDL tool to/ pro

    22、duce the type library (MyCom.tlb) and marshalling code.import oaidl.idl;import ocidl.idl; object,uuid(F1CDC043-28E4-44D0-A4A6-BB8654CD7C02),dual,helpstring(IStr Interface),pointer_default(unique)interface IStr : IDispatchid(1), helpstring(method FirstToUpper) HRESULT FirstToUpper(in BSTR InData,outB

    23、STR * OutData,out,retvallong *result); uuid(D30786A1-E559-43D4-A62B-9A9FA0C559B1),version(1.0),helpstring(MyCom 1.0 Type Library)Visual C+Visual C+282.52.5 编译编译IDLIDL并注册并注册COMCOM组件组件(续)(续)library MYCOMLibimportlib(stdole32.tlb);importlib(stdole2.tlb);uuid(9618DF64-B84E-43BF-8A9C-3634E6A9F88F),helpst

    24、ring(Str Class)coclass StrComdefault interface IStr;Visual C+Visual C+292.5 2.5 编译编译IDLIDL并注册并注册COMCOM组件组件(续)(续) 3注册MyCom.dll 要想让用户能够“透明”地使用创建的组件,首先必须将该组件注册。单击Build|Build Mycom.dll菜单项,VC编译器将生成该组件文件MyCom.dll,并且自动完成注册。其中注册的代码在MyCom.cpp中。 还有一种手工注册组件的方法是利用RegSvr32.exe来进行,请参阅1.3中的5小节注册与注册表的说明。Visual C+Vi

    25、sual C+303 3在在VCVC和和VBVB中使用中使用COMCOM组件组件内容3.1 调用调用COM组件的过程组件的过程3.2 在在VC中创建中创建COM组件客户组件客户 3.3 在在VB中使用中使用COM组件组件 Visual C+Visual C+313.13.1 调用调用COMCOM组件的过程组件的过程 Windows系统下有大量的组件可供使用,前面我们所创建的MyCom组件也注册好了,因此也可以使用,使用COM组件过程是一个典型的客户/服务器(Client/Server)方式。COM组件含有被调用的接口,它是提供服务的,因此是服务方。 Windows系统下的组件如同一大堆积木,不

    26、同的人建房子所使用的积木也不一样,因此不同的人使用的COM组件也不一样,但它们有共同的使用过程:首先客户程序要获取包含组件的服务器(如MyCom.dll就是提供了字符串转化的服务器),然后让服务器创建组组件相关联的类工厂,再由类工厂实例化组件,最后通过接口来使用组件。Visual C+Visual C+323.23.2 在在VCVC中创建中创建COMCOM组件客户组件客户 1打开上一节的MyCom工程后,选择File|New菜单,将弹出的New对话框切换到Projects选项卡后,选择MFC AppWizard(exe)项,在Project name编辑框中输入ComClient工程名称,并选

    27、择Add To Current Workspace单选择按钮。如图8所示。图图8 在在MyCom工作区中添工作区中添加加MyComClient工程工程 Visual C+Visual C+333.23.2 在在VCVC中创建中创建COMCOM组件客户组件客户(2 2)2.单击“OK”按钮进入向导下一步骤,选择单文档应用程序类型。完后按“Finish”按钮生成ComClient工程(这是在一个工作区中包含两个工程的情况)。 3 . 在 对 话 框 资 源IDD_COMCLIENT_DIALOG中添加图9所示的控件,这些控件的属性如表2所示。 图图9对话框界面设计对话框界面设计Visual C+V

    28、isual C+343.2 3.2 在在VCVC中创建中创建COMCOM组件客户组件客户(3 3)控件类型控件类型属性属性值值对应成员变量对应成员变量静态文本控件静态文本控件IDIDIDC_STATICIDC_STATIC CaptionCaption源源 串串 IDIDIDC_STATICIDC_STATIC CaptionCaption目标串目标串 编辑框控件编辑框控件IDIDIDC_EDIT1IDC_EDIT1m_strSourcem_strSource IDIDIDC_EDIT2IDC_EDIT2m_strDestionm_strDestion按钮控件按钮控件IDIDIDOKIDOK

    29、CaptionCaption退出退出 IDIDIDC_BUTTON1IDC_BUTTON1 CaptionCaption转换转换 表表2控件的属性设置与对应的成员变量设置控件的属性设置与对应的成员变量设置 returnVisual C+Visual C+35 3.2 3.2 在在VCVC中创建中创建COMCOM组件客户组件客户(4 4) 4.在工程中添加Istr类 按CTR+W打开类向导对话框后,在当前的工程中加入COM中的一个类。方法为在类向导的Message Map选项卡下,单击“Add Class”按钮,弹出选项“From a Type L i b r a r y ” 如 图 1 0 。

    30、 单 击“From a Type Library”选项,出 现 图 1 1 的 对 话 框 , 把Mycom.tlb选上,又出现图12的对话框,把Istr类选上,按“OK”按钮,这样就把创建的MyCom.tlb中的类Istr加入到该工程中。 图图10从类型库中增加类从类型库中增加类Visual C+Visual C+363.23.2在在VCVC中创建中创建COMCOM组件客户组件客户(5 5) 返回 图图11 选择选择Mycom.tlb 图图12选择类型库中的选择类型库中的IStr类类 Visual C+Visual C+373.23.2 在在VCVC中创建中创建COMCOM组件客户组件客户(

    31、6 6)5主要代码 (1)在应用程序类的InitInstance()函数中增加初始化OLE的代码 BOOL CComClientApp:InitInstance() AfxEnableControlContainer(); AfxOleInit(); /初始化OLE (2)“转换”按钮的实现代码 void CComClientDlg:OnButton1() IStr m_string; if(!m_string.CreateDispatch(MyCom.str.1) /初始化COM库 MessageBox(Create UserInfo error); UpdateData(true); /将

    32、前台数据传到后台 BSTR bstrDestion=SysAllocString(L); m_string.FirstToUpper(m_strSource,&bstrDestion); /调用COM组件中的方法 m_strDestion=bstrDestion; UpdateData(false); /将后台数据传到前台 Visual C+Visual C+383.33.3 在在VBVB中使用中使用COMCOM组件组件 前面用前面用ATL创建了一个创建了一个COM组件组件MyCom,该组件该组件包含有一个类型库包含有一个类型库。因为类型库使得。因为类型库使得可以在可以在COM中实现语言集成,

    33、可以很方便地中实现语言集成,可以很方便地在其它语言编程环境中使用该组件。在其它语言编程环境中使用该组件。Visual C+Visual C+393.33.3 在在VBVB中使用中使用COMCOM组件组件(2 2) 【例3】在VB中调用VC所编的COM组件。 下面讲解在VB6.0的环境创建使用组件的客户程序。 1启动Visual Basic6.0应用程序,启动时(或选择File|New菜单项)出 现NewProject 对话框,选择New选项卡中的Standard EXE项,如图13所示。 2在如图14所示的界面中放几个标签控件、按钮控件并设置其属性。 3将自己制作的MyCom组件插入到该VB应

    34、用程序。选择Project|Reference菜 单项,弹出如图15所示的界面,选择MyCom 1.0 Library项。按“OK”按钮关闭 Reference对话框。 Visual C+Visual C+403.33.3 在在VBVB中使用中使用COMCOM组件组件(3 3)图图13 选择应用程序类选择应用程序类型对话框型对话框图图14 14 设置界面及控件设置界面及控件的属性的属性 图图15 Reference对话框对话框返回返回Visual C+Visual C+413.33.3 在在VBVB中使用中使用COMCOM组件组件(4 4) 4编写“转换”按钮的代码 Private Sub C

    35、ommand1_Click() Dim MyStrCom As StrCom Set MyStrCom = New StrCom 建立COM对象 Dim strSource As String Dim strDestion As String Dim tempStr As String Dim result As Integer strSource = Text1.Text 取源串 result = MyStrCom.FirstToUpper(strSource, strDestion) tempStr = strDestion Text2.Text = tempStr 将转换后的字符串在文本框中进行显示 End SubVisual C+Visual C+精品课件!Visual C+Visual C+精品课件!Visual C+Visual C+443 3.3.3 在在VBVB中使用中使用COMCOM组件组件(5 5)5运行程序,并在“源串”编辑框中输入一行字符,单击“转换”按钮,则将该行字符串的首字母变为大写,并显示在“目标串”编辑框中。

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:利用ATL编写COM组件课件.ppt
    链接地址:https://www.163wenku.com/p-2920910.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库