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 (此、pmkRight、ppmkComposite) 。

要求

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

另请参阅

CreateGenericComposite

IMoniker