- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
16 名字对
十六. 名字对象 概念 IMoniker接口 名字对象的创建 根据显示名创建名字对象 类名字对象的创建 其他名字对象的创建 简单名字对象的绑定过程。 ROT表 文件名字对象的绑定 CoGetInstanceFromFile 函数 复合名字对象概念及其绑定过程 概念 单项和复合名字对象的创建 单项名字对象的绑定过程 复合名字对象的绑定过程 1 概念 我们已知创建COM对象的两种方法: 通过CoGetClassObject 得到类厂,通过类厂接口调用CreateInstance. 直接使用CoCreateInstance 或CoCreateInstanceEx. 客户使用以上两种方法在创建COM对象时,必须提供对象的CLSID或ProgID。COM提供了提供了第三种方法,即利用名字对象(moniker 绰号,名字)创建COM对象的方法。名字对象本身也是一个COM对象。名字对象为另一个COM对象提供了的符号化的表示方法,同时也对组件对象的创建过程进行封装。客户程序只需创建相应的名字对象,并使用名字对象的绑定功能得到组件对象。 在这个意义上,名字对象类似于类厂对象,但是它比类厂对象提供了更多的功能. 其关系对比图如下: 名字对象与类厂对象的功能对比示意图 之所以在类厂对象之外衍生出名字对象,是因为: 名字对象可以以名字的方式来创建COM对象,有时候比使用CLSID的方式更方便. 在一些复杂的应用中,COM对象形成了逻辑上的上下级关系或者是包容的关系.在每一个级别上都是一个COM对象,下级的对象只有在上级的对象范围内才有意义,而且在确定了上级对象以后,下级对象可以更加简单(且更加明确和直观)地使用名字的方式来描述. 在这种情形下,使用从上到下的名字比使用一串的CLSID更加方便合理地创建COM对象. 比如Excel中的文档对象以Excel Application,WorkBook,WorkSheet、Range等层次的COM对象的方式给应用程序员提供访问接口。这些对象的状态存储在复合文档的不同级别的存储对象和流对象中. 比如“c:\My Documents\MyTable.xls! Sheet2 ! R1C1:R2C2”表示存储在文件My Documents\MyTable.xls 的工作表Sheet2的Range R1C1:R2C2对象。 这些对象往往都是永久对象。它们不仅有方法,而且有状态.它们的状态数据以复合文档的形式存储在磁盘上。如果只使用CLSID,根本不能准确地表明是标识为CLSID的COM对象的此实例,而非彼实例.所以, 不仅更直观,而且必须以“复合名字”的方式才能准确地创建或还原这个COM对象. 2. IMoniker接口 名字对象是COM对象的封装和创建者.它实现了IMoniker接口. interface IMoniker : IPersistStream { HRESULT BindToObject ([in] IBindCtx *pbc, [in, unique] IMoniker *pmkToLeft, [in] REFIID riid, [out, iid_is(riid)] void **ppv); ……// 其他成员未列出 } IMoniker接口 派生自IPersistStream接口(p242) 接口成员函数功能上分为四组: 1。名字管理 2。实现绑定 3。管理复合名字对象。4。名字解析。其中最为重要的是绑定操作函数BindToObject。 所有的名字对象都实现了IMoniker接口,名字对象封装了组件对象的所有状态处理过程,客户使用IMoniker接口成员。按照统一的方法处理名字对象。 3 名字对象的创建 3.1 根据显示名创建名字对象 名字对象的名字称为显示名(display name)是一种用户可读的名字.显示名可以是文件路径名,这时返回文件名字对象,也可以是组件对象的CLSID,这时返回类名字对象。也可以是经过扩充的以“!”等间隔开的复合名字,(这时返回复合名字对象)。 IMoniker接口有一个方法GetDisplayName可以返回对象的显示名.然而更重要的是根据显示名来创建名字对象. WINOLEAPI MkParseDisplayName( LPBC pbc, //绑定环境 LPCOLESTR szUserName, //显示名 ULONG *pchEaten, //绑定过程中解析的字符个数 LPMONIKER FAR *ppmk //结果名字对象的指针 ); MkParseDisplayName根据显示名进行解析的结果生成名字对象,并以IMoniker指针的方式返回给客户。 3.2 类名字
文档评论(0)