《COM原理及应用》学习笔记之第八章

本文深入探讨了COM对象的创建方法,包括通过CLSID和ProgID创建对象,以及利用名字技术通过名字对象创建对象。详细介绍了名字技术的地位、命名技术和绑定过程,解释了名字对象、文件名与名字对象的区别,以及名字对象的绑定过程和IMoniker接口的主要功能。此外,文章还阐述了复合名字对象、单项名字对象、反名字对象、指针名字对象、类名字对象和URL名字对象的分类与应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第八章 命名和绑定技术

1 COM 对象的创建方法

       客户程序可以通过 CoCreateInstance 函数创建 COM ,在创建之前必须知道对象的一些基本情况,比如对象的 CLSID 或者对象的 ProgID

       另一种对象创建方法是通过名字对象( moniker )创建,就是利用对象命名和绑定技术(即名字技术)。

 

2 、名字技术的地位

       名字技术算不上 COM 的基本核心,但也是 COM 体系结构中重要的组成部分,它为客户程序和组件程序提供了另一条更为灵活的联系纽带。 OLE 的成功使名字技术得到了广泛的应用,而且在 OLE COM 的不断发展过程中,名字技术发挥了其强大的扩展特性,异步名字对象的实现使它超越了 OLE 的应用范围,能更好地适用于网络环境,特别是 Internet 网络,体现了名字技术强大的生命力。

名字技术允许客户程序通过符号化的方式访问组件对象,而不必通过 CLSID 和类厂访问 COM 对象。名字技术不仅为 COM 对象提供了符号化的表达方式,而且它充分体现了面向对象软件体系的一些重要概念,甚至可以把它当作软件体系结构的一项技术来学习。

 

3 COM 名字技术包括两方面内容: 命名技术和绑定过程

 

4 、名字对象

       名字技术的核心是名字对象, COM 使用术语 ”moniker” 来表示名字对象,它本身也是一个 COM 对象。名字对象为组件对象提供了符号化的表示方法,同时它也对组件对象进行了全面的封装,客户程序只需创建相应的名字对象,然后利用名字对象的绑定功能得到组件对象。名字对象能够自动使组件对象从被动状态进入运行状态,所以名字对象也称为永久智能名字( persistent intelligent names )。

       名字对象封装了组件对象的所有状态处理过程,因此客户程序可以按照统一的方法处理名字对象,即使要引用新的组件对象,客户代码也不必作任何改动。

 

5 、文件名与名字对象

       文件名字对象( file moniker )是一种基本的名字对象,文件名也通过符号化的字符串名指向实际的文件。文件名代表了一个磁盘文件,文件名本身不是一个对象,它只代表了文件对象的路径,因此,文件名不具有智能特性。

       COM 对象的永久状态可以是整个文件,也可以是文件的一部分。

       虽 然名字对象扮演了与文件名相同的角色,但名字对象的功能要强大得多。首先,它所表达的对象范围广阔得多,除了一般的文件对象,它也可以表达文件中的部分内 容,其次,名字对象具有智能特性,即它可以使被动态的对象自动进入运行态,名字对象找到与永久状态联系的运行代码,并启动这些代码,利用对象的初始化功能 使对象进入运行状态,这个过程就是名字对象的绑定操作。

 

6 、名字对象的绑定过程

       名字对象实现了标准的 COM 接口 IMoniker ,客户程序通过 IMoniker 接口获得组件对象。

       客户程序通过名字对象访问组件对象可以分成两步:第一,获得名字对象;第二,执行名字对象的绑定操作(使用 IMoniker 接口的函数 BindToObject ),绑定过程的结果就是组件对象的接口指针。

       客户程序获得名字对象的途径有两条:第一,调用 COM API 函数,如 MkParseDisplayName CreateFileMoniker ;第二,其他对象的接口成员函数传递过来,或者通过其他的数据传输机制得到,比如通过剪贴板或拖-放操作等。

 

7 IMoniker

(1)        名字管理函数: IsEqual Hash IsRunning GetTimeOfLastChange

(2)        绑定函数: BindToObject BindToStorage

(3)        复合名字对象管理函数: Reduce ComposeWith Enum Inverse CommonPrefixWith RelativePathTo IsSystemMoniker

(4)        名字解析函数: GetDisplayName MkParseDisplayName

 

8 、复合名字对象

复合名字对象由一组其他的名字对象组成,也可以包括其他的复合名字对象,复合名字对象提供了一种创建任意复杂名字的机制。 COM 提供了一个标准的复合名字对象实现,称为“通用复合名字对象( generic composite moniker )”,并提供了标准 API 函数创建此类名字对象: CreateGenericComposite

       IMoniker 接口从 IPersistStream 派生而来,所以名字对象也是一个永久对象,它可以有自己的永久状态。复合名字对象的永久状态是一个流,它顺序保存了每个组成名字对象的永久状态。

       通用复合名字对象按统一的方式处理它的各个成员名字对象,无论是绑定过程还是其他一些操作,如名字解析、名字简化等。       

       COM 使用运行对象表( ROT running object table )表管理当前系统中正在运行的、已经被注册的名字对象,客户程序可调用 COM API 函数 GetRunningObjectTable 得到 ROT 表的 IRunningObjectTable 接口指针。

IMoniker 接口的大多数成员函数以及其他一些 API 函数都包含一个被称为绑定环境的对象,在这些函数中,以 IBindCtx 接口指针的形式出现。绑定环境对象主要用于名字对象的整个绑定过程,所以它包含了绑定过程所需要的一些信息。由于绑定环境对象是 COM 实现的系统对象,所以 COM 提供了一个 API 函数创建它: CreateBindCtx 。绑定过程比较耗时,所以绑定环境对象提供了最终时间限制参数。

绑定环境对象在复合名字对象的绑定过程中有很重要的意义,一方面,通过它,绑定过程中可以取得 ROT 表;另一方面,通过对绑定参数的设置可以控制绑定过程的一些行为;而且利用绑定环境对象内部的对象参数可以传递对象信息。

 

9 COM 名字对象分类

       文件名字对象、复合名字对象、单项名字对象、反 - 名字对象、指针名字对象、类名字对象、 URL 名字对象。

       文件名字对象和复合名字对象以及单项名字对象是最常被使用的名字对象,它们联合起来几乎可以实现绝大多数应用的对象命名和绑定过程。而反 - 名字对象和指针名字对象主要用于 COM 系统内部。

 

10 COM 名字对象分类――文件名字对象( file moniker

       文件名字对象可以用来指定任何存储在独立文件中的对象,可以把它与文件系统中赋予文件的路径名字结合起来,文件名字对象实现了从文件路径名到代表文件的文档对象的联系过程。

 

11 COM 名字对象分类――复合名字对象( composite moniker

       复合名字对象充分体现了 COM 命 名和绑定机制的优势,它使多个名字对象可以连接或组合在一起形成新的名字对象。由于不同类型的名字对象有可能被组合到一起,因此复合名字对象提供了连接不 同名字对象空间的能力。操作系统为文件系统提供了一个公用的名字空间作为文件命名空间,因此所有的应用都按同样的方式理解文件名。类似地,每一个容器对象 为它的所属对象都定义了其私有的名字空间。

       COM 把名字对象的组合方式分为通用和特定两种。

 

12 COM 名字对象分类――单项名字对象( item moniker

       单项名字对象用来标识一个被包含在其他对象中的对象,包含它的那个对象被称为容器对象,对象所使用的名字空间由容器对象决定。

       单项名字对象单独存在并没有实际意义,只有当它与其他的名字对象组合之后才真正有用。最经常的用法是,在创建了单项名字对象之后,把它与一个文件名字对象组合起来形成复合名字对象,此复合名字对象给出了对象的全路径名。它与文件名字对象的结合可以描述文件内部的所有对象。

       由于文件名字对象使用了公用的名字空间,所以所有的应用程序都可以理解文件名;而单项名字对象则使用了私有的名字空间,只有容器对象才能理解单项名字对象,一个容器对象不能理解属于另一个容器对象的名字对象。因此,单项名字对象所指对象的容器对象必须实现 IOleItemContainer 接口,文件名字对象对应的组件对象还必须实现 IPersistFile 接口,这是文件名字对象的 IMoniker::BindToObject 接口成员函数所要求的。 IOleItemContainer 接口把容器对象与下属的对象联系起来,把单项名字对象绑定到实际的对象。

       单项名字对象可以用 COM 提供的 API 函数 CreateItemMoniker 创建。

 

13 COM 名字对象分类――反 - 名字对象( anti-moniker

       通常我们在创建自定义名字对象时会用到反 - 名字对象,我们也可以把反 - 名字对象用作复合名字对象中的逆名字对象,它可以抵消掉原名字对象的作用,有如“ .. ”在文件系统命令中所起的作用一样。

       - 名字对象可以用 COM 提供的 API 函数 CreateAntiMoniker 创建。

       - 名字对象通常用作简单名字对象的逆名字对象。

 

14 COM 名字对象分类――指针名字对象( pointer moniker

       指针名字对象是一个特殊的名字对象,它所指的对象只有运行状态,没有被动状态。指针名字对象只是封装了对象的接口指针。

       指针名字对象内部只管理接口指针,它没有永久状态。

       指针名字对象可以通过调用 COM 提供的 API 函数 CreatePointerMoniker 创建。

 

15 COM 名字对象分类――类名字对象( class moniker

       类名字对象标识了一个对象类,它内部封装了对象类的标识符 CLSID 。虽然我们可以通过 CoCreateInstance CoGetClassObject 创建对象,但使用类名字对象不仅可以创建对象,而且它与其他的名字对象组合之后可以形成更为灵活的对象创建或绑定机制。

       类名字对象可以用 COM 提供的 API 函数 CreateClassMoniker 创建。

 

16 COM 名字对象分类―― URL 名字对象

       COM 给出了异步名字对象的实现模型,它允许客户程序按异步方式执行绑定过程。在绑定进行过程中,客户程序可以得到绑定进度信息,也允许用户取消绑定操作。异步名字对象保持了与同步名字对象的兼容,它也允许绑定过程按同步方式进行。以前介绍的各种名字对象属于同步名字对象, URL 名字对象属于异步名字对象。

       异步名字对象与同步名字对象的区别在于,异步名字对象不仅实现了 IMoniker 接口,它还实现了接口 IAsyncMoniker IAsyncMoniker 只继承了 IUnknown 接口,没有增加新的成员函数,它只作为异步名字对象的标志。 COM 提供了 API 函数 IsAsyncMoniker ,用于判断一个名字对象是否为异步名字对象。

       URL Uniform Resource Locator ,统一资源位置)名字对象,封装了几个标准的 Internet 协议,包括“ http: ”、“ https: ”、“ ftp: ”和“ gopher: ”。它的显示名为 URL 路径名,可以是全路径名,也可以是部分路径名。

       URL 名字对象可以利用函数 CreateURLMoniker 创建。

 

17 、自定义名字对象

       从结构上讲,自定义名字对象只是一个支持 IMoniker 接口的进程内 COM 对象。

 

18 COM 名字对象的应用

       作为名字对象的典型应用, OLE 复合文档中的链接对象采用了名字对象技术, OLE 复合文档应用程序为名字对象客户程序,链接对象为服务程序。

       MFC OLE 的支持很全面,用名字对象实现复合文档与链接对象之间的连接只是很小的一部分。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值