项名字对象
另一个 OLE 实现的名字对象类是项名字对象,可用于标识另一个对象中包含的对象。 一种包含的对象是嵌入复合文档的 OLE 对象。 复合文档可以通过为每个对象分配任意名称来标识所包含的嵌入对象,例如“embedobj1”、“embedobj2”等。 另一种包含的对象是文档中的用户选择,例如电子表格中的单元格区域或文本文档中的字符区域。 由所选内容组成的对象称为伪对象,因为在用户标记所选内容之前,该对象不会被视为非重复对象。 电子表格可能使用“1A:7F”等名称标识单元格区域,而字处理文档可能会使用书签的名称标识字符名称。
项名字对象主要用于连接或组合标识容器的另一个名字对象。 通常会创建项名字对象,然后将其组合到(例如)文件名字对象上,以创建对象完整路径的等效项。 例如,可以将文件名字对象“c:\work\report.doc”(用于标识容器对象)与项名字对象“embedobj1”(用于标识容器中的对象)组合在一起,以形成名字对象“c:\work\report.doc\embedobj1”,用于唯一标识特定文件中的特定对象。 还可以连接其他项名字对象来标识深层嵌套对象。 例如,如果“embedobj1”是电子表格对象的名称,若要标识该电子表格对象中的某个单元格区域,则可以追加另一个项名字对象来创建一个与“c:\work\report.doc\embedobj1\1A:7F”等效的名字对象。
与文件名字对象结合使用时,项名字对象将形成完整的路径。 因此,项名字对象将路径名称的概念扩展到文件系统之外,定义路径名称以标识各个对象,而不仅仅是文件。
项名字对象和文件名字对象之间存在显著差异。 文件名字对象中包含的路径对于任何了解文件系统的人都有意义,而项名字对象中包含的部分路径仅对特定容器有意义。 每个人都知道“c:\work\report.doc”指什么,但只有一个特定的容器对象知道“1A:7F”指什么。 一个容器无法解释由另一个应用程序创建的项名字对象;唯一知道哪个对象由项名字对象引用的容器是首先将项名字对象分配给对象的容器。 因此,由文件名字对象和项名字对象组合命名的对象源不仅必须实现 IPersistFile,以促进绑定文件名字对象,还必须实现IOleItemContainer,以促进将项名字对象的名称解析为相应的对象(在文件的上下文中)。
名字对象的优点是,使用名字对象查找对象的人无需了解项名字对象中包含的名称,只要项名字对象是组合的一部分就行。 通常,项名字对象本身没有意义。 将项名字对象组合到文件名字对象后就有了意义。 然后,对组合调用 IMoniker::BindToObject,其中绑定了包含的各个名字对象,并解释名称。
若要创建项名字对象并返回其指向名字对象提供程序的指针,OLE 提供了帮助程序函数 CreateItemMoniker。 此函数创建项名字对象并返回其指向提供程序的指针。
相关主题