iMoniker 接口 (objidl.h)
使你能够使用名字对象,该对象包含唯一标识 COM 对象的信息。 具有指向名字对象 IMoniker 接口的指针的对象可以查找、激活和访问标识的对象,而无需提供有关该对象在分布式系统中实际位置的任何其他特定信息。
名字对象用作 COM 中链接的基础。 链接对象包含标识其源的名字对象。 当用户激活链接对象以对其进行编辑时,将绑定名字对象;这会将链接源加载到内存中。
继承
IMoniker 接口继承自 IPersistStream。 IMoniker 还具有以下类型的成员:
方法
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 接口,并唯一标识系统中的单个对象。 提供名字对象的对象创建名字对象后,该对象中无法更改此信息。 如果名字对象提供程序更改信息,则它只能通过创建新的名字对象来执行此操作,然后该对象将唯一标识有问题的对象。
名字对象具有以下两个重要功能:
- 名字对象可以保存到永久性存储。 将名字对象加载回内存时,它仍标识相同的对象。
- 名字对象支持名为 binding 的操作,即查找由名字对象命名的对象,激活它 (将其加载到内存) (如果它尚未处于活动状态),并返回指向该对象上请求的接口的指针。
反名字对象实现
反名字对象是文件、项和指针名字对象 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 名字对象上,该对象还支持 IUnknown 和 IAsyncMoniker 接口。 IMoniker 接口从 IPersistStream 以及 IUnknown 继承其定义,IPersistStream 继承自 IPersist。 因此, IMoniker 实现包括对 IPersistStream 和 IPersist 的支持。IAsyncMoniker 接口只是 IUnknown。 (没有其他方法。) 它用于允许客户端确定名字对象是否支持异步绑定。
若要获取指向此对象上的 IMoniker 接口的指针,请调用 CreateURLMonikerEx 函数。
名字对象客户端 (使用名字对象获取指向对象的接口指针) 通常不需要知道它正在使用的名字对象的类;它只是使用 IMoniker 接口指针调用方法。
名字对象提供程序 (分发标识其对象以使其可供名字对象客户端访问的名字对象) 如果它标识的对象包含在另一个对象中并且可以使用字符串单独标识,则必须使用项名字对象。 它还需要使用另一种类型的名字对象 (例如,) 文件名字对象来标识容器对象。
若要使用项名字对象,必须使用 CreateItemMoniker 函数创建名字对象。 若要允许在绑定项名字对象时加载对象,对象的容器必须实现 IOleItemContainer 接口。
名字对象提供程序的最常见示例是支持链接的 COM 应用程序。 如果 COM 应用程序支持链接到小于基于文件的文档的对象,则需要使用项名字对象。 对于允许链接到文档中所选内容的服务器应用程序,可以使用项名字对象来标识这些对象。 对于允许链接到嵌入对象的容器应用程序,可以使用项名字对象来标识嵌入的对象。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 2000 专业版 [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows 2000 Server [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | objidl.h |