复合名字对象
名字对象最有用的功能之一是可以将名字对象连接或组合在一起。 复合名字对象是其他名字对象的组合,可以确定各部分之间的关系。 这样,通过提供两个或多个作为部分路径等效项的名字对象,可以汇编对象的完整路径。 可以组合同一类(如两个文件名字对象)或不同类(如文件名字对象和项名字对象)的名字对象。 如果要编写自己的名字对象类,还可以使用文件或项名字对象组合名字对象。 复合的基本优势是,它提供一段代码来实现每个可能的名字对象,这是较为简单的名字对象的组合。 这大大减少了对特定自定义名字对象类的需求。
由于不同类的名字对象可以相互组合,因此名字对象提供联接多个命名空间的功能。 文件系统会为存储为文件的对象定义通用命名空间,因为所有应用程序都了解文件系统路径名称。 同样,容器对象还为它包含的对象定义专用命名空间,因为没有容器了解另一个容器生成的名称。 名字对象允许联接这些命名空间,因为可以将文件名字对象和项名字对象组合。 名字对象客户端可以使用单个机制在命名空间中搜索所有对象。 客户端只需在名字对象上调用 IMoniker::BindToObject,名字对象代码将处理其余内容。 在复合名字对象上调用 IMoniker::GetDisplayName 时,会使用所有单个名字对象的显示名称的串联来创建名称。
此外,由于可以编写自己的名字对象类,名字对象组合允许向对象的命名空间添加自定义扩展。
有时,可以采用特殊方式组合特定类的两个名字对象。 例如,可以将表示不完整路径的文件名字对象和表示相对路径的另一个文件名字对象组合在一起,形成表示完整路径的单个文件名字对象。 例如,可以将文件名字对象“c:\work\art”与相对文件名字对象“.”组合,以得到”c:\work\backup\myfile.doc”。 这是非通用组合的示例。
另一方面,通用组合允许任何两个名字对象的连接,而不考虑其类。 例如,可以将项名字对象组合到文件名字对象上,当然不能反过来。
由于非通用组合取决于所涉及的名字对象的类,因此其详细信息由特定名字对象类的实现定义。 如果编写新的名字对象类,则可以定义新类型的非通用组合。 相比之下,通用组合由 OLE 定义。 因通用组合而创建的名字对象称为通用复合名字对象。
这三个类(即文件名字对象、项名字对象和泛型复合名字对象)都协同工作,它们是最常用的名字对象类。
名字对象客户端应调用 IMoniker::ComposeWith,以使用另一个对象在名字对象上创建组合。 它在内部调用的名字对象决定它是否可以执行通用或非通用组合。 如果名字对象实现确定通用组合可用,则 OLE 提供 CreateGenericComposite 函数来方便执行此操作。
相关主题