- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
COM组件实现学习心得151116
COM组件实现学习心得1 概述本节在复习COM接口与对象知识的基础上,讲述了通过注册表来管理COM对象以及COM组件的注册,COM类厂的原理和COM库的管理及装卸载。2 COM接口与对象COM接口与对象主要讲述了三个里程碑:用vtable作为接口,解决了名字冲突和二进制结构兼容问题;用Dynamic_cast、Static_cast实现COM接口的转换;用AddRef和Release实现对COM对象生命周期的管理。COM对象由CLSID来标示,是判断COM对象身份是否一致的重要依据,客户创建对象的时候必须要提供CLSID。COM接口是客户与对象之间的通信协议,对象实现COM接口,客户调用COM接口。COM对象是客户的交互实体,包括属性和方法,或者状态和操作,其实现由组件完全包装起来,通过COM接口提供服务。COM组件的实现方式分为两种,进程内组件(dll)和进程外组件(exe)。进程内组件通常通过dll的导出函数为客户提供服务,常用到的API函数有LoadLibrary、GetProcAddress、FreeLibrary,dll也可以引出全局变量,并通过DumpBin来检查组件的引出函数和变量。进程外组件通常标示为exe的形式,然后通过进程间的通信(DDE、消息机制、共享内存、RPC/LPC等)来为客户提供服务,例如应用程序调用系统服务的过程如下图所示:图应用程序调用系统服务3 COM类厂类厂是用于创建COM对象的COM对象,它完成了COM对象的创建过程,更好地把客户与对象隔离开来。类厂实现一个或多个创建接口,缺省的接口为IClassFactory,类厂本身并没有CLSID。创建类厂对象通常由函数DllGetClassObject来完成,其函数原型是:HRESULT DllGetClassObject(const CLSID clsid, const IID iid,(void **)ppv);第一个参数为COM对象标示;第二个参数由用户输入,指示了返回类厂接口的指针类型;第三个参数表示返回结果的接口指针。所有的COM组件都是有COM类厂创建的,客户通过COM类厂来创建对象具有很大的灵活性。要创建一个COM对象,客户需要提供组件位置、clsid、iid和结果接口指针地址ppv,具体过程是:(1)根据组件位置加载库(LoadLibrary);(2)GetProcAddress,获取DllGetClassObject,创建类厂;(3)用clsid和IID_IClassFactory获得类厂对象接口指针pFactory(4)用iid、ppv调用pFactory-CreateInstanceCOM对象创建过程的位置是透明的,可以极大地为客户程序提供便利服务。在当前环境下,每个clsid必定与某个组件相联系,要实现对象创建过程的位置透明性,就需要维护clsid与组件位置之间的映射关系。在Windows平台上,使用系统注册表来保存这种映射关系,所以,从clsid可以找到对应组件的位置3 注册表管理COM组件在Windows操作系统中,注册表是一个正式的共享系统数据库,注册表中包含关于系统软件和硬件的配置及用户相关信息。在COM技术中使用注册表存储关于组件的信息,客户可以在注册表中搜索他所需要的组件。Windows系统注册表是一种树状结构,树根是“我的电脑”,预定义了5个子节点:HKEY_CLASSES_ROOT为HKEY_LOCAL_MACHINE的一个子节点HKEY_CURRENT_USER为HKEY_USERS的一个子节点HKEY_LOCAL_MACHINEHKEY_USERSHKEY_CURRENT_CONFIG在注册表HKEY_CLASSES_ROOT的分支下有一个CLSID的关键字,CLSID关键字下列有系统安装的所有组件的CLSID。在CLSID下最重要的关键字是InprocServer32,此关键字的值是组件所在的DLL路径名称。由于使用CLSID来查看组件非常麻烦,因此在每个CLSID关键字下都对应着一个ProgID,它是组件开发者给某个CLSID指定一个容易记忆的名称,但是ProgID不能保证唯一。CLSID和ProgID都是COM对象的标示,CLSID同时表示为一个128位整数或者一个字符串,是唯一的;ProgID容易记忆,一般是应用程序名+版本号的形式。ProgID主要作用是获得相应的CLSID,COM库提供了两个函数CLSIDFromProgID和ProgIDFromCLSID,来完成ProgID和CLSID之间的相互转换。客户可以在注册表中查看需要的组件信息,因为每个dll或exe都知道它所包含的组件,并把它所包含的组件信息注册到注册表中,所以在每个包含组件的dll或exe中,都要提供组件信息写入注册表的方法。
文档评论(0)