第03篇 COM的实现.ppt

  1. 1、本文档共87页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 COM的实现 主要内容 进程内组件和进程外组件 通过注册表管理COM对象 类厂的概念与实现 COM库的相关内容 COM实现过程 字典组件的实现 序 COM不但提供组件程序与客户程序之间交互的协议细节,也提供了实现细节,用于协调组件程序和客户程序的行为,并尽可能提高资源利用率。 COM是一个与平台无关的组件软件模型; 但COM的实现与操作系统平台密切相关。 我们在Windows上使用的COM标准只是COM的一个具体实现。 3.1 进程内组件和进程外组件 进程内组件( in process component ) DLL形式的组件 客户程序调用组件程序的服务时,会把组件程序装入到自己的进程中,所以客户程序和组件程序运行在同一个进程空间中。 进程外组件( out of process component ) EXE形式的组件 组件程序在被调用时用有自己的进程空间,所以客户程序与组件程序运行在不同的进程空间中。 3.1.1 进程内组件 客户程序要想使用DLL形式的组件,则必须知道该DLL的特定信息,而这些信息是通过“引出”来暴露给客户程序的。 DLL程序既可以引出函数,也可以引出全局变量。 DLL函数的引出,是通过引出函数表完成的: 引出函数表中包括:函数的名字、序号、地址。 为了使生成的DLL通用,需要让引出函数遵循__stdcall调用习惯。并在函数定义的前面加上extern “C”说明符(不是必须的)。 说明DLL引出函数的方法 1、传统方法 首先用extern “C”和_stdcall修饰函数,比如: Extern “C” int _stdcall myFuction(int n); 然后编写一个DEF文件,用于描述DLL的相关信息,如: ;DictComp.def: Declares the module parameters for the DLL LIBRARY “DictComp” DESCRIPTION ‘DictComp Win32 DLL’ EXPORTS CreateObject @1 2、直接说明 可以通过_declspec(dllexport)说明符直接说明引出函数: Extern “C” _declspec(dllexport) int _stdcall myFuction(int n); 客户程序如何使用DLL程序 首先,客户程序调用LoadLibrary函数装入DLL,并得到DLL的模块句柄,供后面使用: HMODULE hModual; hModual = LoadLibrary(DictComp.dll); 然后,客户程序调用GetProcAddress函数获得DLL中引出函数的地址: typedef BOOL (_stdcall* pf)(CLSID clsid, const IID iid, void **ppv); pf fnCreateObject; fnCreateObject = (pf)GetProcAddress(hModual, CreateObject); fnCreateObject(clsid, iid, ppv); 最后,调用FreeLibrary把DLL卸出内存: FreeLibrary(hModual); 3.1.2 进程外组件 EXE形式的组件称为“进程外组件”。 进程外组件带来的问题: 一个进程如何调用另一个进程中的函数? 参数如何从一个进程传到另一个进程? Windows平台上进程之间通信的方法: 动态数据交换(DDE) 命名管道(named pipe) 消息机制 RPC/LPC等等 COM采用RPC/LPC的方法实现进程间的通信。 应用程序调用其他进程中的系统服务 客户程序调用进程外组件程序 代理DLL和存根DLL 客户程序只与同一进程中的代理DLL打交道; 进程外组件程序只与同一进程中的存根DLL打交道。 代理DLL和存根DLL除了完成LPC调用外,还需要对参数和返回值进行翻译和传递: 代理DLL将客户程序的参数及其它一些调用信息组装成一个数据包传递给组件进程,这个过程称为“参数列集”。 组件进程接收到数据包后,进行解包操作,把参数信息提取出来,这个过程称为“散集”。 进程外组件的LPC调用以及列集散集过程对于程序员来说是透明的,不用关心这些细节。 在实现进程外组件时,需要额外实现代理和存根DLL. 3.2 通过注册表管理COM对象 系统注册表是一个全操作系统范围公用的信息仓库,其中包含了所有COM组件的必要的信息。 按照COM规范,客户程序要通过COM库完成COM对象的创建工作,而COM库要通过注册表所提供的信息来进行COM对象的创建工作。 通过对组件进行注册,将组件信息写入注册表。 如果

您可能关注的文档

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档