IMoniker::ComposeWith 方法 (objidl.h)

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

语法

HRESULT ComposeWith(
  [in]  IMoniker *pmkRight,
  [in]  BOOL     fOnlyIfNotGeneric,
  [out] IMoniker **ppmkComposite
);

参数

[in] pmkRight

指向要撰写到此名字对象末尾的名字对象上的 IMoniker 接口的指针。

[in] fOnlyIfNotGeneric

如果 为 TRUE,则调用方需要非泛型组合,因此仅当 pmkRight 是此名字对象可以采用某种方式组合的名字对象类(而不是形成泛型复合)时,该操作才应继续。 如果 为 FALSE,则方法可以根据需要创建泛型复合。 大多数调用方应将此参数设置为 FALSE

[out] ppmkComposite

指向接收复合名字对象指针的 IMoniker 指针变量的指针。 成功后,实现必须对生成的名字对象调用 AddRef ;调用 Release 由调用方负责。 如果发生错误,或者如果名字对象没有 (编写任何内容,例如,使用项名字对象或文件名字对象) 撰写反名字对象,应将 *ppmkComposite 设置为 NULL

返回值

此方法可以返回E_OUTOFMEMORY和E_UNEXPECTED的标准返回值,以及以下值。

返回代码 说明
S_OK
名字对象已成功组合。
MK_E_NEEDGENERIC
指示 fOnlyIfNotGenericTRUE,但如果不创建泛型复合名字对象,则不能将名字对象组合在一起。

注解

将两个名字对象联接在一起称为 合成。 有时,同一类的两个名字对象可以组合在所谓的非泛型组合中。 例如,可以将表示不完整路径的文件名字对象和表示相对路径的另一个文件名字对象组合在一起,形成表示完整路径的单个文件名字对象。 给定名字对象类的非泛型组合只能在该名字对象类的 ComposeWith 实现中处理。

将任意类的两个名字对象组合称为 泛型组合,这可以通过调用 CreateGenericComposite 函数来实现。

名字对象的组成是一个关联操作。 也就是说,如果 A、B 和 C 是名字对象,则 Comp () 表示组合操作,Comp ( Comp ( A、B ) 、C )

始终等于 Comp ( A、Comp ( B、C ) ) 。

调用方备注

若要合并两个名字对象,应调用 ComposeWith 而不是调用 CreateGenericComposite 函数,以便第一个名字对象有机会执行非泛型组合。

提供项名字对象来标识其对象的对象将调用 ComposeWith 来提供一个完全标识对象位置的名字对象。 例如,这适用于支持链接到文档部分的服务器,或支持链接到文档内嵌入对象的容器。 在这种情况下,需要执行以下操作:

  1. 创建标识对象的项名字对象。
  2. 获取标识对象的容器的名字对象。
  3. 在标识容器的名字对象上调用 ComposeWith ,并将项名字对象作为 pmkRight 参数传递。

实施者说明

可以使用非泛型组合或泛型组合,将当前名字对象与 pmkRight 指向的名字对象组合在一起。 如果 pmkRight 指示的名字对象的类与当前名字对象的类相同,则可以使用 pmkRight 的内容来执行更智能的非泛型合成。

在编写新的名字对象类时,必须确定是否有任何类型的名字对象,无论是你自己的类还是另一个类,你想要给予特殊处理。 如果是这样,请实现 ComposeWith 以检查 pmkRight 是否是应进行此处理的类型的名字对象。 为此,可以调用名字对象的 IPersist::GetClassID 方法,或者如果已定义支持自定义接口的名字对象,则可以针对该接口的名字对象调用 QueryInterface 。 特殊处理的示例是具有相对文件名字对象的绝对文件名字对象的非泛型组合。 特殊名字对象的最常见情况是名字对象类的反函数 (从 IMoniker::Inverse) 的实现中返回的任何值。

如果 pmkRight 完全否定接收方,导致生成的复合为空,则应在 ppmkComposite 中传回 NULL,并返回状态代码S_OK。

如果 pmkRight 参数不是你给予特殊处理的类,请检查 fOnlyIfNotGeneric 以确定下一步要执行的操作。 如果 fOnlyIfNotGenericTRUE,请通过 ppmkComposite 传回 NULL,并返回状态代码MK_E_NEEDGENERIC。 如果 fOnlyIfNotGenericFALSE,则调用 CreateGenericComposite 函数以一般方式执行组合。

特定于实现的说明

实现 备注
反名字对象 如果 fOnlyIfNotGenericTRUE,则此方法将 ppmkComposite 设置为 NULL 名字对象并返回MK_E_NEEDGENERIC;否则,该方法返回将两个名字对象合并为泛型复合的结果。 请注意,在反名字对象右侧组合文件、项或指针名字对象会产生泛型复合,而不是不组合为任何对象,就像组合顺序相反的情况一样。
类名字对象 遵循协定,其行为类似于项名字对象,因为它可以返回E_INVALIDARG和MK_E_NEEDGENERIC,依此类推。
文件名字对象 如果 pmkRight 是反名字对象,则返回的名字对象为 NULL。 如果 pmkRight 是一个复合对象,其最左侧的组件是反名字对象,则返回的名字对象是移除了最左侧反名字对象的复合对象。 如果 pmkRight 是文件名字对象,则此方法会尽可能将两个名字对象折叠为单个文件名字对象。 例如,如果 (两个文件名字对象都表示绝对路径(如 d:\work 和 e:\reports) 中所示),则返回的名字对象为 NULL ,返回值MK_E_SYNTAX。 如果 pmkRight 既不是反名字对象也不是文件名字对象,则 方法将检查 fOnlyIfNotGeneric 参数;如果为 FALSE,则该方法将两个名字对象合并为泛型复合;如果为 TRUE,则该方法将 *ppmkComposite 设置为 NULL 并返回MK_E_NEEDGENERIC。
泛型复合名字对象 如果 fOnlyIfNotGenericTRUE,则此方法将 *pmkComposite 设置为 NULL 并返回MK_E_NEEDGENERIC;否则,该方法通过调用 CreateGenericComposite 函数返回合并两个名字对象的结果。
项名字对象 如果 pmkRight 是反名字对象,则返回的名字对象为 NULL。 如果 pmkRight 是一个复合对象,其最左侧的组件是反名字对象,则返回的名字对象是删除最左边的反名字对象之后的复合对象。 如果 pmkRight 不是反名字对象,则如果 fOnlyIfNotGenericFALSE,则该方法将两个名字对象合并为泛型复合;如果 fOnlyIfNotGenericTRUE,则该方法返回 NULL 名字对象和MK_E_NEEDGENERIC返回值。
OBJREF 名字对象 如果 pmkRight 是反名字对象,则返回的名字对象为 NULL。 如果 pmkRight 是一个复合对象,其最左侧的组件是反名字对象,则返回的名字对象是移除了最左侧反名字对象的复合对象。 如果 pmkRight 既不是反名字对象,也不是其最左侧组件是反名字对象的复合名字对象,该方法将检查 fOnlyIfNotGeneric 参数。 如果为 FALSE, 方法将两个名字对象合并为泛型复合;如果为 TRUE,则该方法将 *ppmkComposite 设置为 NULL 并返回MK_E_NEEDGENERIC。
指针名字对象 如果 pmkRight 是反名字对象,则返回的名字对象为 NULL。 如果 pmkRight 是一个复合对象,其最左侧的组件是反名字对象,则返回的名字对象是删除最左边的反名字对象之后的复合对象。 如果 fOnlyIfNotGenericFALSE,则返回的名字对象是两个名字对象的泛型组合;否则, 方法将 *ppmkComposite 设置为 NULL ,并返回MK_E_NEEDGENERIC。
URL 名字对象 URL 名字对象支持两个 URL 的组合:一个是使用相对 URL 组成的基 URL。 此组合是根据相对 URL 上的 RFC 完成的。 如果 fOnlyIfNotGenericTRUE,则该方法返回MK_E_NEEDGENERIC。 否则,此方法仅返回 CreateGenericComposite (this、pmkRight、ppmkComposite) 。

要求

要求
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 objidl.h

另请参阅

CreateGenericComposite

IMoniker