iMoniker 接口 (objidl.h)

使你能够使用名字对象,该对象包含唯一标识 COM 对象的信息。 具有指向名字对象 IMoniker 接口的指针的对象可以查找、激活和获取对已标识对象的访问,而无需获取有关该对象实际位于分布式系统中的任何其他特定信息。

名字对象用作在 COM 中链接的基础。 链接对象包含标识其源的名字对象。 当用户激活链接的对象以对其进行编辑时,将绑定名字对象;这会将链接源加载到内存中。

继承

IMoniker 接口继承自 IPersistStreamIMoniker 还包含以下类型的成员:

方法

IMoniker 接口具有这些方法。

 
IMoniker::BindToObject

绑定到指定的对象。 绑定过程涉及查找对象、根据需要将其置于运行状态,并向调用方提供指向已标识对象的指定接口的指针。
IMoniker::BindToStorage

绑定到指定对象的存储。 与 IMoniker::BindToObject 方法不同,此方法不会激活名字对象标识的对象。
IMoniker::CommonPrefixWith

基于此名字对象与指定名字对象通用的前缀创建新的名字对象。
IMoniker::ComposeWith

通过将当前名字对象与指定的名字对象组合在一起,创建新的复合名字对象。
IMoniker::Enum

检索指向复合名字对象组件的枚举器的指针。
IMoniker::GetDisplayName

检索名字对象的显示名称。
IMoniker::GetTimeOfLastChange

检索上次更改此名字对象所标识的对象的时间。
IMoniker::Hash

使用名字对象的内部状态创建哈希值。
IMoniker::Inverse

创建一个名字对象,该名字对象是此名字对象的反函数。 当组合到此名字对象右侧或类似结构之一时,名字对象将无所构成。
IMoniker::IsEqual

确定此名字对象是否与指定的名字对象相同。
IMoniker::IsRunning

确定此名字对象标识的对象当前是否已加载并运行。
IMoniker::IsSystemMoniker

确定此名字对象是否为系统提供的名字对象类之一。
IMoniker::P arseDisplayName

将显示名称转换为名字对象。
IMoniker::Reduce

将名字对象减少为最简单的形式。
IMoniker::RelativePathTo

在此名字对象与指定的名字对象之间创建相对名字对象。

注解

与文件系统中的文件路径类似,名字对象包含允许 COM 对象定位和激活的信息。 名字对象可以识别任何类型的 COM 对象,从存储在文件中的文档对象到嵌入对象中的选定内容。 COM 提供了一组名字对象类,可用于创建标识系统中最常见的对象的名称对象。 例如,可能有一个对象表示电子表格中的单元格区域,该单元格本身嵌入在存储在文件中的文本文档中。 在分布式系统中,此对象的名字对象将标识对象系统的位置、系统上的文件的物理位置、该文件在该文件中的嵌入对象的存储,最后确定嵌入对象中单元格区域的位置。

名字对象支持 IMoniker 接口,该接口派生自 IPersistStream 接口,并唯一标识系统中的单个对象。 提供名字对象的对象创建名字对象后,该对象内无法更改此信息。 如果名字对象提供程序更改信息,则它只能通过创建新的名字对象对象(然后唯一标识有问题的对象)来执行此操作。

名字对象具有以下两个重要功能:

  • 名字对象可以保存到永久性存储中。 当名字对象加载回内存中时,它仍会标识相同的对象。
  • 名字对象支持一个名为绑定的操作,这是定位名字对象所命名的对象的过程,激活它 (将其加载到内存) (如果它尚未处于活动状态),并返回指向该对象上请求接口的指针。

反名字对象实现

反名字对象是文件、项和指针名字对象的 COM 实现的反名字对象。 也就是说,由文件名字对象、项名字对象或指针名字对象组合到任何内容右侧的反名字对象。

如果你是名字对象客户端,则通常不需要使用反名字对象。 当需要名字对象反转时,应调用 IMoniker::Inverse。 例如,如果需要反向删除复合名字对象的最后一个部分,请使用 IMoniker::Enum 枚举名字对象的各个部分,并在最右侧的块上调用 Inverse 。 不应出于此目的使用反名字对象,因为你无法确定组合中最正确的部分认为反名字对象是反名字对象。

唯一应该显式使用反名字对象的情况是编写新的名字对象类,并且没有构造反名字对象的特殊要求。 在这种情况下,可以从 Inverse 的实现中返回反名字对象。 在 IMoniker::ComposeWith 的实现中,你应该为遇到的每个反名字对象消灭一个名字对象。

使用 CreateAntiMoniker 函数创建这些名字对象。

类名字对象实现

类名字对象是表示对象类的名字对象。 类名字对象绑定到创建它们的类的类对象。

类名字对象在与其他类型的名字对象(如文件名字对象或项名字对象)组合时最有用。 类名字对象也可能由支持绑定到 IClassActivator 接口的名字对象右侧组成。 这允许 IClassActivator 提供对类对象和类实例的访问权限。

若要使用类名字对象,必须使用 CreateClassMoniker 函数来创建这些名字对象。

文件名字对象实现

文件名字对象是表示文件系统中路径的名称;文件名字对象可以标识在其自己的文件中保存的任何对象。 若要标识文件中包含的对象,可以编写其他类的名字对象 (例如,文件名字对象右侧的项名字对象) 。 但是,复合中文件名字对象左侧的名字对象必须是另一个文件名字对象、反名字对象或类名字对象。 例如,对于项目名字对象,在复合文件中显示文件名字对象左侧是非法的。

请注意,反名字对象是整个文件名字对象的反名字对象,而不是名字对象表示的路径组件的反函数;也就是说,在文件名字对象右侧撰写反名字对象时,将删除整个文件名字对象。 如果要仅删除由文件名字对象表示的路径的最右侧组件,则必须基于“..”路径创建单独的文件名字对象,然后将它撰写到文件名字对象末尾。

名字对象客户端 (使用名字对象获取指向对象的接口指针) 通常不需要知道名字对象类;它只需使用 IMoniker 接口指针调用方法。

名字对象提供程序 (分发标识其对象,使其可供名字对象客户端访问,) 如果标识的对象存储在文件中,则必须使用文件名字对象。 如果每个对象驻留在其自己的文件中,则文件名字对象是唯一所需的类型。 如果标识的对象小于文件,则需要使用另一种类型的名字对象 (,例如,除了文件名字对象之外,项名字对象) 。

若要使用文件名字对象,必须使用 CreateFileMoniker 函数来创建名字对象。 若要允许在绑定文件名字对象时加载对象,对象必须实现 IPersistFile 接口。

名字对象提供程序的最常见示例是支持链接的 COM 服务器应用程序。 如果 COM 服务器应用程序仅支持将其整个位置链接到基于文件的文档,则文件名字对象是唯一所需的名字对象类型。 如果 COM 服务器应用程序支持链接到小于文档 (的对象,例如文档部分或嵌入对象) ,则必须使用项名字对象以及文件名字对象。

泛型复合名字对象实现

泛型复合名字对象是复合名字对象,其组件彼此没有特殊知识。

合成是将两个名字对象联接在一起的过程。 有时,特定类的两个名字对象可以采用特殊方式组合:例如,表示不完整路径的文件名字对象和表示相对路径的另一个文件名字对象可以组合在一起,形成表示完整路径的单个文件名字对象。 这是非泛型组合的示例。 另一方面,通用组合可以连接任何两个名字对象,无论它们的类是什么。 由于非泛型合成依赖于所涉及的名字对象的类,因此它只能由特定类的 IMoniker::ComposeWith 方法实现来执行。 如果编写新的名字对象类,则可以定义新类型的非泛型合成。 相比之下, CreateGenericComposite 函数执行泛型组合。

名字对象客户端 (使用名字对象获取指向对象的接口指针,) 通常不需要知道名字对象的类,或者它是泛型复合还是非泛型复合:它只需使用 IMoniker 接口指针调用方法。

名字对象提供程序 (分发标识对象,使其对象可供名字对象访问,) 可能需要将两个名字对象组合在一起。 (例如,如果使用项名字对象来标识对象,则必须使用标识对象的容器的名字对象来组合该对象。) 使用 IMoniker::ComposeWith 方法执行此操作,在第一个名字对象上调用该方法,并将第二个名字对象作为参数传递:此方法可能会生成泛型或非泛型复合。

唯一应该显式创建泛型复合名字对象的时间是编写自己的名字对象类。 在 IMoniker::ComposeWith 的实现中,应尽可能尝试执行非泛型合成;如果无法执行非泛型合成和泛型组合是可接受的,则可以调用 CreateGenericComposite 函数来创建泛型复合名字对象。

项名字对象实现

项名字对象用于标识容器中的对象,例如文档的一部分、复合文档中的嵌入对象或电子表格中的单元格区域。 项名字对象通常与文件名字对象结合使用;文件名字对象用于标识容器,而项名字对象用于标识容器中的项。

项名字对象包含文本字符串;容器对象使用此字符串将包含的项与其他项区分开来。 容器对象必须实现 IOleItemContainer 接口;此接口使项名字对象代码能够获取指向对象的指针,只给定标识对象的字符串。

名字对象客户端 (使用名字对象获取指向对象) 的接口指针通常不需要知道名字对象的类;它只需使用 IMoniker 接口指针调用方法。

名字对象提供程序 (分发标识其对象以使其可供名字对象访问的名字对象) 如果标识的对象包含在另一个对象中并且可以使用字符串单独标识的对象,则必须使用项名字对象。 例如,使用另一种类型的名字对象 (文件名字对象) 标识容器对象。

若要使用项名字对象,必须使用 CreateItemMoniker 函数来创建名字对象。 若要允许在绑定项名字对象时加载对象,对象容器必须实现 IOleItemContainer 接口。

名字对象提供程序的最常见示例是支持链接的 COM 应用程序。 如果 COM 应用程序支持链接到小于基于文件的文档的对象,则需要使用项名字对象。 对于允许链接到文档中选定内容的服务器应用程序,可以使用项名字对象来标识这些对象。 对于允许链接到嵌入对象的容器应用程序,可以使用项名字对象来标识嵌入的对象。

OBJREF 名字对象实现

OBJREF 名字对象表示对在本地或远程进程外服务器上运行的对象实例的引用。 名字对象标识对象实例和对象正在运行的计算机。

OBJREF 名字对象在许多方面与指针名字对象类似,但正在运行的对象正在进程外。 客户端可以在 OBJREF 名字对象上调用 IMoniker::BindToObject ,并使用它获取的指针来访问正在运行的对象,而不考虑其位置。

指针名字对象的重要区别在于,OBJREF 名字对象的显示名称可以嵌入到 HTML 页面中,而名字对象所表示的正在运行的对象可以由客户端脚本、小程序或 ActiveX 控件绑定。

OBJREF 名字对象的主要用途是通过 Internet 获取对正在运行的对象实例的访问权限。 活动服务器页或生成动态 HTML 内容的一些其他方法会将 OBJREF 名字对象在参数中的显示名称置于小程序或 ActiveX 控件中。 小程序或控件的代码调用 CreateObjrefMoniker 函数,以基于显示名称创建 OBJREF 名字对象,然后在生成的 OBJREF 名字对象上调用 IMoniker::BindToObject 来访问正在运行的对象实例。 然后,活动服务器页将指向正在运行的对象指针封送回页面的客户端。

指针名字对象实现

指针名字对象实质上包装接口指针,使其看起来像名字对象,并且可以传递给需要名字对象的接口。 通过调用指针的 QueryInterface 方法来绑定指针名字对象。

指针名字对象实例拒绝序列化;也就是说, IPersistStream::Save 将返回错误。 但是,这些名字对象可以在 RPC 调用中封送到其他进程;在内部,系统会使用封送接口指针的标准范例对指针进行封送和取消封送。

很少需要指针名字对象。 仅当需要名字对象来标识没有持久表示形式的对象时,才使用指针名字对象。 指针名字对象允许此类对象参与名字对象绑定操作。

URL 名字对象实现

IMoniker 的 URL 名字对象实现位于 URL 名字对象上,该对象还支持 IUnknownIAsyncMoniker 接口。 IMoniker 接口从 IPersistStream 以及 IUnknown 继承其定义,IPersistStream 继承自 IPersist 因此, IMoniker 实现包括对 IPersistStreamIPersist 的支持。

IAsyncMoniker 接口只是 IUnknown。 (没有其他方法。) 它用于允许客户端确定名字对象是否支持异步绑定。

若要获取指向此对象上的 IMoniker 接口的指针,请调用 CreateURLMonikerEx 函数。

名字对象客户端 (使用名字对象获取指向对象) 的接口指针通常不需要知道它正在使用的名字对象类;它只需使用 IMoniker 接口指针调用方法。

一个名字对象提供程序 (分发标识其对象以使其可供名字对象客户端访问的名字对象) 如果标识的对象包含在另一个对象中并且可以使用字符串单独标识的对象,则必须使用项名字对象。 它还需要使用另一种类型的名字对象 (,例如文件名字对象) 来标识容器对象。

若要使用项名字对象,必须使用 CreateItemMoniker 函数来创建名字对象。 若要允许在绑定项名字对象时加载对象,对象容器必须实现 IOleItemContainer 接口。

名字对象提供程序的最常见示例是支持链接的 COM 应用程序。 如果 COM 应用程序支持链接到小于基于文件的文档的对象,则需要使用项名字对象。 对于允许链接到文档中选定内容的服务器应用程序,可以使用项名字对象来标识这些对象。 对于允许链接到嵌入对象的容器应用程序,可以使用项名字对象来标识嵌入的对象。

要求

   
最低受支持的客户端 Windows 2000 专业版 [桌面应用|UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用|UWP 应用]
目标平台 Windows
标头 objidl.h

另请参阅

CreateAntiMoniker

CreateClassMoniker

CreateFileMoniker

CreateGenericComposite

CreateItemMoniker

CreateObjrefMoniker

CreateURLMonikerEx

名字对象