当前位置首页 > 计算机 > 编程与开发语言
搜柄,搜必应! 快速导航 | 使用教程

COM组件编程基础课件

文档格式:PPT| 78 页|大小 3.64MB|2024-12-13 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 78
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 单击此处编辑母版标题样式,,,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,,,,,,,,,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,,,*,§,10. 1 COM,简介,一、什么是,COM,,COM,(,Component Object Model,): 组件对象模型,,其中:,1.,它定义了一套为构建一个组件所必需遵循的规则或,者说它是一个说明如何建立可动态交替更新组件的规,范,该规范为客户和组件提供保证能够互操作应该遵,循的标准;,2.,它定义了组件和它们的客户之间互相作用的方式采,用客户进程直接调用组件中的方法,使得组件和客户,端无需任何中介组件就能互相联系;,,3. COM,组件有可执行代码组成,即以二进制代码形,式重用,一般通过,DLL/EXE,形式发布,且通过,GUID,来保证每个,COM,对象是全球唯一的§10. 1 COM简介一、什么是COM,1,说明:,,1. COM,不是一类程序的扩展名,也不是一种程序设计,语言;,,2. COM,可利用,DLL,来给组件提供动态链接的能力,但,COM,不是,DLL,;,,3. COM,可采用各种语言进行编写(语言无关性),同一,个软件中不同组件可以使用不同的语言和工具开发,;,,4. COM,是由,OLE,(对象连接与嵌入)技术发展而来,,COM,技术的目的是为开发、维护应用程序提供高效灵,活手段,,说明:,2,二、,COM,服务器、,COM,对象、,COM,接口和函数的关系,,1.,一个,COM,服务器(,DLL,或,EXE,)可以包含若干个,COM,对象;,2.,一个,COM,对象可以包含若干个接口;,3.,一个接口可以包含若干个函数。

    COM,服务器,,,,,,,,,,,COM,对象,1,,,,,,,,,,,接口,1,,,,,函数,1,函数,2,接口,2,,,函数,1,,COM,对象,2,,,,,,,,,接口,1,,,,,,,函数,1,函数,2,函数,3,二、COM服务器、 COM对象、COM接口和函数的关系COM,3,,IInterface_1,IInterface_2,COM,服务器,,,,,,,,,,,,接口对象,1,,,,,函数,1,函数,2,接口对象,2,,,函数,1,IUnknown,说明:一般将,COM,对象表示为带固定格式的圆形接头,,每个接头表示一个对外提供的接口,,IUnknown,接,口处首要地位,.,IInterface_1IInterface_2COM服务器,4,三、,接口,,1. COM,接口提供访问对象的一种方式,应用程序只能通过一个接,口指针访问对象的函数COM,接口由一个,全 局唯一标识符,(,GUID,),IID,来区分和确定2.,所有,COM,接口都从,IUnknown,接口派生,struct IUnknown,{,virtual LONG QueryInterface( REFIID riid, void **ppv) = 0;,virtual ULONG AddRef( void) = 0;,virtual,ULONG,Release( void) = 0;,},,其中:,,⑴,,QueryInterface,通过接口标识符,riid,查询(确定)接口,返回,指向接口的指针的指针,同时调用,AddRef(),;,,⑵,AddRef,和,Release,用来管理对象接口被访问的参数计数。

    调用这两种方法的规则为:设,N,为接口被访问的计数器•,无论何时客户接收到接口指针时,必须调用,AddRef,:,N++,•,无论何时客户完成使用接口指针时,必须调用,Release,:,N- -,其目的是管理被使用的,COM,何时能够被释放:当,N=0,时,三、接口,5,,UUID/GUID,:,Universally/Globals Unique IDentifiers,,通用,/,全局(球)唯一标识符(,128,位,,16,字节,,,,32,个字符),,GUID,的格式为:,“,xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx”,其中每个,x,是,0-9,或,A-F,范围内的一个十六进制的数字例如:,97AD6FA3-8CAD-4068-90AE-320545A1E8C8,,即为有效的,GUID,值,CLSID,:,COM,类标识符(,CLASS Identifiers,),LIBID,:类型库标识符(,type LIBrary Identifier,),IID,:接口标识符(,Interface Identifiers,),ProgID,:,Programmer IDentifiers,,程序员给,CLSID,指定的一个程序员易记的名称,根据约定,, ProgID,格式如下,:, . . ,IDL,:接口定义语言(,Interface Definition Language,),DCOM,:分布式组建对象模型(,Distributed Component Object Model,),,名词解释,UUID/GUID: Universally/Global,6,§,10. 2,基于,ATL,之,DLL,实现,COM,,一、,ATL,简介,,ATL,:活动模版库(,Active Template Liabrary,),它是为明确创建,COM,对象这个目的而提供的模版类库,它提供了对几个接,口的内在支持,包括,IUnknown,、,IClassFactory,、,IDispatch,,,其中:,IClassFactory,(类工厂)是为访问一个,COM,服务器(,DLL,或,EXE,)中包含多个,COM,对象中的接口对象提供的接口,类。

    IClassFactory,声明如下:,,IClassFactory : public IUnknown,{,public:,virtual HRESULT STDMETHODCALLTYPE CreateInstance(,IUnknown *pUnkOuter,,REFIID riid,,void **ppvObject) = 0;,virtual HRESULT STDMETHODCALLTYPE LockServer(,BOOL fLock) = 0;,};,,说明:,IClassFactory,派生于,IUnknown,,因此它仍然支持标准的,,QueryInterface,的,COM,接口§10. 2 基于ATL之DLL实现COM 一、ATL简,7,,IDispatch,(双重接口)是为和其他语言兼容提供的接口类,,IDispatch,声明如下:,,IDispatch : public IUnknown,{,public:,virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(,……,virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(,……,virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(,……,virtual HRESULT STDMETHODCALLTYPE Invoke(,/* [in] */ DISPID dispIdMember,,/* [in] */ REFIID riid,,/* [in] */ LCID lcid,,/* [in] */ WORD wFlags,,/* [out][in] */ DISPPARAMS *pDispParams,,/* [out] */ VARIANT *pVarResult,,/* [out] */ EXCEPINFO *pExcepInfo,,/* [out] */ UINT *puArgErr) = 0;,};,,说明:自定义(单)接口就是直接继承,IUnknown,IDispatch(双重接口)是为和其他语言兼容提供的接,8,二、利用,ATL,向导建立,COM,二、利用ATL 向导建立COM,9,注意本章使用,注意本章使用,10,步骤,1,:建立,ATL,项目,步骤1:建立ATL项目,11,COM组件编程基础课件,12,COM组件编程基础课件,13,说明:,,1.,允许合并代理,/,存根代码,代理:是为远程过程调用将参数打包的一段代码,存根:是在远程过程调用中将参数解包的一段代码,如果你建立的,COM,(,DCOM,)需要远程访问则选择这,一项。

    2. COM + 1.0,,COM +,是微软,COM,系统的最新版本且版本号是,1.0,,,“,+,”,表示对原,COM,的一些特征和服务进行了改进在某,些方面,简化了某些与,COM,相关任务的属性和服务3.,如果选择服务器类型是,“,可执行文件,(EXE),”,则不支持,,“,MFC,”,和,“,COM + 1.0”,,4.,如果选择服务器类型是,“,服务,(EXE),”,,,则,“,允许合并,代理,/,存根代码,”,、,“,MFC,”,和,“,COM + 1.0”,均不支持,说明:,14,COM组件编程基础课件,15,步骤,2,:添加一个接口类:,IClassOne,步骤2:添加一个接口类:IClassOne,16,在此处填写“,IClassOne”,在此处填写“IClassOne”,17,COM组件编程基础课件,18,说明:,1.,线程模型,,•,单线程:所有选择(标记为)单一线程模型的接口对,象只能在一个线程上运行,而且它不是别的,线程必须是所谓的主(,main,)线程•,单元:单元亦称为公寓(,Apartment,),单元(公寓),是线程在内存中运行的区域,选择,“,单元,”,就,表示除主线程单元外,还提供主线程单元之外,的(子)单元,而将建立的接口对象将来是在,子单元中运行,即多个单元中的线程实例化的,多个接口对象将能够并发运行。

    •,自由:和单线程类似只有一个主单元(公寓),但和,单线程不同的是在这惟一的单元中可以有多个,线程在执行•,两者:单元,+,自由,2.,聚合:是一个外部对象暴露内部对象接口的过程,,说明:1. 线程模型,19,再在接口类“,IClassOne”,中添加一个,接口函数“,ILoginDlg”,再在接口类“IClassOne”中添加一个,20,COM组件编程基础课件,21,COM组件编程基础课件,22,添加的接口函数如下:,添加的接口函数如下:,23,步骤,3,:向项目中添加对话框资源,步骤3:向项目中添加对话框资源,24,COM组件编程基础课件,25,COM组件编程基础课件,26,对话框进行如下设置:,*****,对话框进行如下设置: *****,27,使用类向导给,对话框资源“,IDD_LOGIN_DLG,”,配置类,“,CLoginD,ialog”,使用类向导给对话框资源“IDD_LOGIN_DLG”,28,COM组件编程基础课件,29,步骤,4,:在接口函数中添加代码,步骤4:在接口函数中添加代码,30,编译生成,COM,组建,查看发布文件,编译生成COM组建查看发布文件,31,COM组件编程基础课件,32,其中,DEF,文件中,4,个函数的作用是:,,•DllCanUnloadNow,当调用结束时负责卸载,COM,•DllGetClassObject,,客户程序通过它访问,COM,,它创建由,CLSID,制定类型的对,象,该对象就是在客户程序中调用,CoCreateInstance(),中请求对象,的类工厂。

    •,DllRegisterServer,,在注册表中注册该,COM,组件(服务器),注意:当在命令行中执行,regsvr32,命令时调用该函数,,例如:,regsvr32,,D:,\ComDll\ComDll\Debug\ComDll.dll,,•,DllUnregisterServer,从注册表中卸载该,COM,组件(服务器),,注意:当在命令行中执行,regsvr32,命令时调用该函数,,,例如:,regsvr32 -u,,D:\ComDll\ComDll\Debug\ComDll.dll,说明:,ATL,是自注册的,即在生成,DLL,或,EXE,时自动组册,其中DEF文件中4个函数的作用是:,33,COM组件编程基础课件,34,测试程序之建立,测试程序之建立,35,COM组件编程基础课件,36,COM组件编程基础课件,37,COM组件编程基础课件,38,为“测试,ComOneDll”,菜单项添加消息映射函数,为“测试ComOneDll”菜单项添加消息映射函数,39,在函数中添加代码,在函数中添加代码,40,WINOLEAPI CoCreateInstance(,REFCLSID rclsid,,LPUNKNOWN pUnkOuter,,DWORD dwClsContext,,REFIID riid, //,接口标识符,LPVOID FAR* ppv); //,返回指向借口函数的指针,其中:,API,函数,CoCreateInstance,的作用是调用,COM,,返回指向接口,函数的指针。

    实际是负责调用,DEF,文件中给出的,,DllGetClassObject(),实例化组件对象 (类工厂)的函数• rclsid,:,DllGetClassObject(),函数用该类标识符实例化组件对象,,• pUnkOuter,:,COM,的,IUnknown,,用,ATL,生成的,COM,取值,NULL,• dwClsContext,:表明,COM,服务器程序运行所在的上下文,(,环境,),,这,个参数指定了包含被请求,COM,的服务器程序类型dwClsContext,取值范围有,6,个,在这里仅给出与我们编程有关的,3,个,,CLSCTX_INPROC_SERVER,:,COM,服务器程序是一个,DLL,,表明,COM,与客户程序运行在同一进程中,CLSCTX_LOCAL_SERVER,:,COM,服务器程序是一个,EXE,,表明,COM,程序运行在一个单独的进程中,,CLSCTX_ALL,:代表任何一种均可以,API,函数,CoCreateInstance,原形如下:,WINOLEAPI CoCreateInstance( 其,41,编译、运行结果,编译、运行结果,42,regsvr32 e:\ALTCOM08\AltToCom1\Debug\AltToCom1.dll,手工注册,:,开始,─,,运行,regsvr32 e:\ALTCOM08\AltToCom1,43,§,10. 3,基于,ATL,之,EXE,文件实现,COM,§10. 3 基于ATL之EXE文件实现COM,44,步骤,1,:建立,ATL,项目,步骤1:建立ATL项目,45,COM组件编程基础课件,46,COM组件编程基础课件,47,COM组件编程基础课件,48,步骤,2,:向项目中添加对话框资源,步骤2:向项目中添加对话框资源,49,COM组件编程基础课件,50,COM组件编程基础课件,51,COM组件编程基础课件,52,COM组件编程基础课件,53,COM组件编程基础课件,54,COM组件编程基础课件,55,步骤,3,:构造窗口类,首先向项目中添加一个,C++,类,步骤3:构造窗口类,56,COM组件编程基础课件,57,在,MyWindow.h,文件中添加代码构造窗口类及关联类,在MyWindow.h文件中添加代码构造窗口类及关联类,58,COM组件编程基础课件,59,COM组件编程基础课件,60,在主函数(,main,)中添加利用,CMyWindow,类建立窗口的代码,在主函数(main)中添加利用CMyWindow类建立窗口的,61,编译(编译后自动运行),编译(编译后自动运行),62,COM组件编程基础课件,63,COM组件编程基础课件,64,步骤,4,:在项目中添加一个接口类,步骤4:在项目中添加一个接口类,65,COM组件编程基础课件,66,COM组件编程基础课件,67,COM组件编程基础课件,68,COM组件编程基础课件,69,生成的接口函数,生成的接口函数,70,向接口函数中添加代码,向接口函数中添加代码,71,查看发布文件,查看发布文件,72,测试程序之建立,测试程序之建立,73,COM组件编程基础课件,74,添加代码,添加代码,75,编译、运行,编译、运行,76,COM组件编程基础课件,77,COM组件编程基础课件,78,。

    点击阅读更多内容
    卖家[上传人]:20211108
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档