复合名字对象

名字对象最有用的功能之一是可以将名字对象连接或组合在一起。 复合名字对象 是其他名字对象的组合,可以确定各部分之间的关系。 这样,便可以将对象的完整路径组合到给定的两个或多个名字对象,这些名字对象等效于部分路径。 可以编写同一类(如两个文件名字对象)或不同类(如文件名字对象和项名字对象)的名字对象。 如果要编写自己的名字对象类,还可以使用文件或项名字对象组合名字对象。 复合的基本优势是,它提供一段代码来实现每个可能的名字对象,这是更简单的名字对象的组合。 这大大减少了对特定自定义名字对象类的需求。

由于不同类的名字对象可以相互组合,因此名字对象提供联接多个命名空间的功能。 文件系统为存储为文件的对象定义一个通用命名空间,因为所有应用程序都了解文件系统路径名称。 同样,容器对象还为它包含的对象定义专用命名空间,因为没有容器理解另一个容器生成的名称。 名字对象允许联接这些命名空间,因为文件名字对象和项名字对象可以组合在一起。 名字对象客户端可以使用单个机制搜索命名空间中所有对象。 客户端只需在名字对象上调用 IMoniker::BindToObject,名字对象代码将处理其余内容。 在复合上调用 IMoniker::GetDisplayName 会使用所有单个名字对象的显示名称的串联来创建名称。

此外,由于可以编写自己的名字对象类,名字对象组合允许向对象的命名空间添加自定义扩展。

有时,特定类的两个名字对象可以采用特殊方式组合。 例如,表示不完整路径的文件名字对象和表示相对路径的另一个文件名字对象可以组合在一起,形成表示完整路径的单个文件名字对象。 例如,文件名字对象“c:\work\art”可以与相对文件名字对象“.”组合在一起。\backup\myfile.doc“等于”c:\work\backup\myfile.doc”。 这是 非泛型组合的示例。

另一方面,泛型组合允许任何两个名字对象(无论其类是什么)的连接。 例如,可以将项目名字对象组合到文件名字对象上,当然不是这样。

由于非泛型组合依赖于所涉及的名字对象的类,因此其详细信息由特定名字对象类的实现定义。 如果编写新的名字对象类,则可以定义新类型的非泛型合成。 相比之下,泛型组合由 OLE 定义。 由于泛型组合而创建的名字对象称为泛型复合名字对象。

这三个类、文件名字对象、项名字对象和泛型复合名字对象都协同工作,它们是最常用的名字对象类。

名字对象客户端应调用 IMoniker::ComposeWith,以使用另一个名字对象创建复合对象。 它在内部调用的名字对象决定它是否可以执行泛型或非泛型合成。 如果名字对象实现确定泛型组合可用,则 OLE 提供 CreateGenericComposite 函数来促进此作。

反名字对象

类名字对象

文件名字对象

项名字对象

指针名字对象