COM的实现.ppt
《COM的实现.ppt》由会员分享,可在线阅读,更多相关《COM的实现.ppt(69页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、COM的实现西安电子科技大学软件学院西安电子科技大学软件学院Agenda进程内组件和进程外组件利用注册表管理COM组件类工厂COM库实现COM实现过程西安电子科技大学软件学院西安电子科技大学软件学院COM实现COM不仅提供了规范/交互协议的细节,还提供了全面的实现。因为客户程序或组件程序在建立交互之前和交互完成之后,不可避免的要和系统发生交互。COM作为一套完整的组件体系结构,提供了所有的实现细节,以协调客户程序或组件程序的行为。西安电子科技大学软件学院西安电子科技大学软件学院COM实现另外,COM实现还为程序员开发提供了强有力的支持,帮助程序员完成了很多复杂工作。COM的实现与Windows
2、操作系统密切相关,尽管COM号称一种平台无关的组件模型,它的实现不可避免的使用了Windows操作系统的很多特性,如注册表和动态连接库。但另一方面这些系统特性也为COM增色不少。学习本章内容时,重点了解COM实现的原理,即COM实现究竟以何种方式体现了COM的特性(如进程透明特性);学会如何使用这些实现(COM库函数)具体怎么实现(C+代码)则在其次,因为这些具体的实现Microsoft已经为我们完成了。西安电子科技大学软件学院西安电子科技大学软件学院进程内组件和进程外组件西安电子科技大学软件学院西安电子科技大学软件学院进程和DLL进程对于Windows系统来说,进程是一个正在执行的程序,它有
3、单独的内存地址空间,拥有自己的一些系统资源。在Windows上:启动一个应用程序时,系统就创建一个进程来执行新的应用程序;进程一般和一个EXE文件对应。代码之间的直接调用是以进程为边界的。以EXE形式实现的COM组件称为进程外组件。西安电子科技大学软件学院西安电子科技大学软件学院进程和DLLDLL(动态连接库)是在进程的执行过程中动态装入到进程的内存空间的代码模块。DLL中的代码模块可以被应用程序直接调用。DLL又是与应用程序相对独立的。以DLL形式实现的COM组件称为进程内组件。西安电子科技大学软件学院西安电子科技大学软件学院进程内组件组件程序与客户程序在同一地址空间内;客户程序所得到的接口
4、指针直接指向组件程序中接口的vtable;客户程序通过接口调用的函数是真正实现服务的函数。效率高。EJB提供所谓的本地接口支持类似的组件调用方式。CORBA也提供类似本地环境下的方法调用。WebService没有。西安电子科技大学软件学院西安电子科技大学软件学院DLL特性DLL是相对独立的模块,可以被多个客户程序使用。DLL的独立性要通过接口的约定来保证。DLL的访问接口也建立在二进制代码一级。DLL的接口是一些函数接口(函数名、参数信息、返回值信息)或全局变量。西安电子科技大学软件学院西安电子科技大学软件学院DLL函数接口每个DLL程序模块包含一个导出函数表;其中包含了函数的名字、函数的序号
5、以及函数的地址。客户进程在动态连接时建立一张表,把客户的调用与DLL里函数的地址连接起来(利用函数指针)。DLL中的导出函数应使用_stdcall调用习惯。DLl中的导出函数应该是标准C函数。(DLL是用C+/C/Delphi建立的)extern“C”int _stdcall MyExportFunc(int i);西安电子科技大学软件学院西安电子科技大学软件学院创建DLL程序创建一个创建一个DLL工程工程实现要导出的函数实现要导出的函数,使用使用extern“C”和和_stdcall修饰符修饰符建立建立DEF文件或者文件或者使用使用_declspec(export)导出函数导出函数DLL程序
6、的创建过程西安电子科技大学软件学院西安电子科技大学软件学院DLL的使用使用使用LoadLibrary装入装入DLL使用使用GetProcAddress获取函数地址,获取函数地址,使用函数使用函数使用使用FreeLibrary把把DLL程序卸出内存程序卸出内存DLL的使用西安电子科技大学软件学院西安电子科技大学软件学院说明?DLL中导出的函数都是标准C函数,为什么能够在DLL中实现对象函数调用?客户程序使用进程内组件时,通过DLL的函数接口所访问的只是获取接口指针的函数(可以用C语言实现)。客户程序拿到接口指针后,调用组件服务时所使用的函数接口是通过的接口的定义得到的,而函数的入口地址可以通过接
7、口指针访问到。西安电子科技大学软件学院西安电子科技大学软件学院进程外组件客户与进程外组件通信必须跨越进程边界。不能使用传统的函数调用。要解决的问题一个进程如何调用另一个进程中的函数参数/返回值如何传递西安电子科技大学软件学院西安电子科技大学软件学院进程外组件Windows上的跨进程通信机制:DDE命名管道LPC与RPC机理相同,用于在同一机器上的不同进程之间进行通信。因为LPC不需要通过网络传递信息,所以比RPC简单、效率高。RPC西安电子科技大学软件学院西安电子科技大学软件学院进程外组件参数/返回值的传递由代理DLL和存根DLL完成。包含了对数据的编组(marshaling)和解组(unma
8、rshaling)过程。代理和存根不需要开发人员编写代码;对于客户程序来说,只看到与代理DLL的交互:交互方式也是直接的接口成员函数调用,和与真正的进程内组件交互方式相同。对客户程序来说,组件有了一致的模型进程透明特性。西安电子科技大学软件学院西安电子科技大学软件学院调用另一进程的系统API存根存根DLL应用应用A(进程进程A)进程进程B服务服务f应用应用A调调用系统用系统API存根存根DLL通过通过LPC调用服务调用服务f存根存根DLL返回最终结果返回最终结果调用服务调用服务f通过通过LPC返回结果返回结果应用程序通过API调用系统服务西安电子科技大学软件学院西安电子科技大学软件学院存根存根
9、DLL组件程序组件程序(组件进程组件进程)组件对象组件对象调用另一进程的系统API代理代理DLL中代理对象中代理对象客户程序客户程序(客户进程客户进程)客户调客户调用接口或用接口或成员函数成员函数代理对象代理对象通过通过LPC调用组件存根调用组件存根代理对象代理对象返回最返回最终结果终结果存根存根DLL通过通过LPC返回结果返回结果调用组件调用组件对象接口或对象接口或成员函数成员函数服务完成服务完成后返回后返回客户程序调用进程外组件西安电子科技大学软件学院西安电子科技大学软件学院通过注册表管理COM对象西安电子科技大学软件学院西安电子科技大学软件学院COM对象管理客户程序通过CLSID来创建C
10、OM并与COM交互;COM对象实际创建是由COM库来完成的;COM库通过Windows系统注册表所提供的信息进行组件的创建工作。客户程序和组件程序都可以对注册表进行访问组件程序把它所实现的COM对象的信息以及接口信息保存到注册表中。客户程序创建组件对象时也要访问组件注册的信息。但客户程序一般不直接访问注册表,而是由COM库访问注册表信息,完成操作。西安电子科技大学软件学院西安电子科技大学软件学院Windows注册表结构Windows注册表树型结构西安电子科技大学软件学院西安电子科技大学软件学院COM用到的注册信息COM用到了Windows注册表中的HKEY_CLASSES_ROOT键。在注册表
11、中按照几种方式对COM组件进行了组织:按COM对象的CLSID组织CLSID子键按接口组织Interface子键按类型库组织TypeLib子键按COM对象的名字组织按组件类别组织西安电子科技大学软件学院西安电子科技大学软件学院注册表中的COM组件信息最常用的是CLSID子键,该子键下列出了当前机器上的所有组件信息。每个CLSID子键下面,都包含了改组件对象的一些相关信息:组件程序的路径:进程内组件:InprocServer32,缺省值为组件程序(DLL)的全路径文件名。进程外组件:LocalServer32,缺省值为组件程序(EXE)的全路经文件名。ProgID:COM对象对应的字符串名字。其
12、它信息,组件程序的版本、OLE组件的InprocHandler32子键、组件的图标、组件的类型库。西安电子科技大学软件学院西安电子科技大学软件学院注册表中的COM组件信息CLSID子键示例D:PROGRA1MICROS2OfficeGRAPH9.EXEMSGraph.Chart.8西安电子科技大学软件学院西安电子科技大学软件学院注册表中的COM组件信息在HKEY_CLASSES_ROOT键的子键Interface中给出了当前系统中一些COM接口的配置信息。代理DLL和存根DLL的信息在HKEY_CLASSES_ROOT键的子键TypeLib中给出了系统中类型库的信息。在HKEY_CLASSES
13、_ROOT键下还直接存在与CLSID子键中ProgID对应的组件的名字信息。利用这些子键可以完成组件名字组件CLSID的对应关系查找。这些子键中还可能包含组件的版本信息。这就允许一个组件对象的多个版本共存与一个系统中。西安电子科技大学软件学院西安电子科技大学软件学院注册表中的COM组件信息Equation.3CLSIDFromProgIDProgIDFromCLSID多个组件版本并存名字与CLSID的相互转换西安电子科技大学软件学院西安电子科技大学软件学院注册表中的COM组件信息COM提供了对组件进行分类的机制:如果COM组件支持同一组接口,则可以把它们分到同一类中。一个组件对象可以被分到多个
14、类中。类别信息也用一个GUID来标识。CLSID子键中的“ImplementedCategories”记录了组件的类别信息。HKEY_CLASSES_ROOT键下的子键“ComponentCategories”中记录了系统中所有的组件类别。通过类别查到的组件必定支持该类别所要求的接口,可以节省查询过程。西安电子科技大学软件学院西安电子科技大学软件学院COM组件的注册操作组件程序被安装到机器上后,必须通过某种途径把它的信息注册到注册表中,然后客户程序才能使用。组件按照其注册能力可以分为自注册组件和非自注册组件。非自注册组件的注册过程与组件程序没有直接关系,必须单独进行注册信息的配置。如利用reg
15、edit直接编辑注册表;或者一个注册表文件,然后在regedit中导入等。西安电子科技大学软件学院西安电子科技大学软件学院自注册组件进程内组件的自注册功能实现Windows提供了用于注册进程内组件的工具RegSvr32.exe。RegSvr32通过调用进程内组件实现的函数完成注册或注销工作。进程内组件用于注册的两个函数为DllRegisterServer和DllUnregisterServer。提供了这两个导出函数的进程内组件就是自注册组件。这两个函数的实现可以利用WindowsSDK提供的注册表操作的API。RegSvr32 C:DictCompDictComp.dllRegSvr32 /u
16、 C:DictCompDictComp.dll西安电子科技大学软件学院西安电子科技大学软件学院自注册组件进程外组件的自注册功能实现COM规范规定,支持自注册功能的进程外组件必须支持两个命令行参数:/RegServer完成注册操作/UnregServer完成注销操作大小写无关,且“/”可以用“-”代替支持这命令行参数的进程外组件就是自注册组件。西安电子科技大学软件学院西安电子科技大学软件学院类工厂西安电子科技大学软件学院西安电子科技大学软件学院组件对象的创建COM对象的创建过程客户程序客户程序COM库库组件程序组件程序注册表注册表客户程序客户程序调用调用COM库库的函数创建对象的函数创建对象CO
17、MCOM库根据注库根据注册表找到组件册表找到组件程序的入口函数程序的入口函数COMCOM库库调用调用组件入口函数组件入口函数创建组件对象创建组件对象西安电子科技大学软件学院西安电子科技大学软件学院ClassFactory类工厂是用来创建组件对象的。对应每一个COM类,都有一个类工厂专门用于创建该COM类的对象。类工厂本身也是一个COM对象,它支持一个特殊的接口IClassFactory。class IClassFactory:public IUnknownvirtual HRESULT _stdcall CreateInstance(IUnknown*pUnknownOuter,const I
18、ID&iid,void*ppv)=0;virtual HRESULT _stdcall LockServer(BOOL bLock)=0;西安电子科技大学软件学院西安电子科技大学软件学院DllGetClassObject类工厂本身也是一个COM对象,类工厂的是由DllGetClassObject函数创建的。该函数由组件程序实现并导出。HRESULT DllGetClassObject(const CLSID&clsid,const IID&iid,(void*)ppv);西安电子科技大学软件学院西安电子科技大学软件学院COM对象创建接口COM库提供了三个API函数用于对象的创建。COM库与类工
19、厂的交互也在体现在这三个函数中。CoGetClassObjectCoCreateInstanceCoCreateInstanceEx西安电子科技大学软件学院西安电子科技大学软件学院COM对象创建接口CoGetClassObject用于返回类工厂对象接口指针。HRESULT CoGetClassObject(const CLSID&clsid,DWORD dwClsContext,COSERVERINFO*pServerInfo,/用于用于DCOM,COM中应该为中应该为NULLconst IID&iid,(void*)ppv);西安电子科技大学软件学院西安电子科技大学软件学院CoGetClas
20、sObject工作原理装入组件代码装入组件代码调用组件的调用组件的DllGetClassObject创建类工厂对象创建类工厂对象返回类工厂对象返回类工厂对象接口指针接口指针CoGetClassObject工作原理进程内组件西安电子科技大学软件学院西安电子科技大学软件学院CoGetClassObject工作原理启动组件进程启动组件进程等待等待返回返回COM中相应的中相应的类工厂信息类工厂信息CoGetClassObject工作原理进程外组件利用利用CoRegisterClassObject将组件所支持的将组件所支持的COM类的类的类工厂注册到类工厂注册到COM中中组件进程西安电子科技大学软件学院
21、西安电子科技大学软件学院COM对象创建接口CoCreateInstance封装了CoGetClassObject的调用,利用CoGetClassObject返回的类工厂接口指针,调用CreateInstance函数创建COM对象,直接返回COM对象的接口指针。调用CoGetClassObject时直接将pServerInfo置为NULL,所以不能用来创建远程对象。HRESULT CoCreateInstance(const CLSID&clsid,IUnknown*pUnknownOuter,DWORD dwClsContext,const IID&iid,(void*)ppv);西安电子科技
22、大学软件学院西安电子科技大学软件学院COM对象创建接口CoCreateInstanceEx功能类似CoCreateInstance。可以用来创建远程对象。可以一次返回多个接口指针。HRESULT CoCreateInstance(const CLSID&clsid,IUnknown*pUnknownOuter,DWORD dwClsContext,COSERVERINFO*pServerInfo,DWORD dwCount,MULTI_QI*rgMultQI);西安电子科技大学软件学院西安电子科技大学软件学院使用原则如果要创建远程对象或者希望一次获取对象多个指针接口,应使用CoCreateIn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- COM 实现
限制150内