IMoniker::CommonPrefixWith 方法 (objidl.h)

基于此名字对象与指定名字对象通用的前缀创建新的名字对象。

语法

HRESULT CommonPrefixWith(
  [in]  IMoniker *pmkOther,
  [out] IMoniker **ppmkPrefix
);

参数

[in] pmkOther

指向另一个名字对象上的 IMoniker 接口的指针,用于确定是否存在通用前缀。

[out] ppmkPrefix

IMoniker* 指针变量的地址,该变量接收指向此名字对象和 pmkOther 的常见前缀的接口指针。 成功时,实现必须在生成的名字对象上调用 AddRef ;调用方负责调用 Release。 如果发生错误或没有常见前缀,则实现应将 *ppmkPrefix 设置为 NULL

返回值

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

返回代码 说明
S_OK
存在一个常见前缀,该前缀既不是此名字对象,也不是 pmkOther
MK_S_NOPREFIX
不存在任何常见前缀。
MK_S_HIM
整个 pmkOther 是此名字对象的前缀。
MK_S_US
这两个名字对象是相同的。
MK_S_ME
此名字对象是 pmkOther 名字对象的前缀。
MK_S_NOTBINDABLE
此方法是在相对名字对象上调用的。 对相对名字对象采用公共前缀并不有意义。

注解

CommonPrefixWith 创建一个新的名字对象,该名字对象包含此名字对象和另一个名字对象上名字对象上名字对象的公共前缀。 例如,如果一个名字对象表示路径“c:\projects\secret\art\pict1.bmp”,另一个名字对象表示路径“c:\projects\secret\docs\chap1.txt”,则这两个名字对象的共同前缀将是表示路径“c:\projects\secret”的名字对象。

给呼叫者的备注

CommonPrefixWith 方法主要在 IMoniker::RelativePathTo 方法的实现中调用。 使用名字对象查找对象的客户端很少需要调用此方法。

仅当 pmkOther 和此名字对象都是绝对名字对象时,才调用此方法。 绝对名字对象是文件名字对象或泛型复合,其最左侧的组件是表示绝对路径的文件名字对象。 不要对相对名字对象调用此方法,因为它不会产生有意义的结果。

实现者的说明

你的实现应首先确定 pmkOther 是否是你识别的类的名字对象,例如,如果 pmkOther 是此名字对象) 的类,则可以提供特殊处理 (。 如果是这样,则实现应确定两个名字对象的公共前缀。 否则,它应在调用 MonikerCommonPrefixWith 函数时传递这两个名字对象,该函数可正确处理泛型事例。

特定于实现的说明

实现 备注
反名字对象 如果其他名字对象也是反名字对象,该方法将返回MK_S_US并将 ppmkPrefix 设置为此名字对象。 否则,该方法调用 MonikerCommonPrefixWith 函数。 此函数正确处理其他名字对象是泛型复合的情况。
类名字对象 如果 pmkOther 等于此名字对象,则检索指向此名字对象的指针并返回MK_S_US。 如果 pmkOther 是类名字对象,但不等于此名字对象,则返回MK_E_NOPREFIX。 否则,返回以 pmkThispmkOtherppmkPrefix 的形式调用 MonikerCommonPrefixWith 的结果,后者处理 pmkOther 是泛型复合名字对象的情况。
文件名字对象 如果这两个名字对象都是文件名字对象,此方法将返回一个基于两个文件名字对象开头的常见组件的文件名字对象。 文件名字对象组件可以是以下类型:
  • 窗体 \\server\share 的计算机名称。 计算机名称被视为单个组件,因此表示路径“\\myserver\public\work”和“\\myserver\private\games”的两个名字对象没有“\\myserver”作为通用前缀。
  • 例如,驱动器指定 (“C:”) 。
  • 目录或文件名。
如果另一个名字对象不是文件名字对象,则此方法在调用 MonikerCommonPrefixWith 函数时传递这两个名字对象。 此函数正确处理其他名字对象是泛型复合的情况。

如果没有常见的前缀,此方法将返回MK_E_NOPREFIX。

泛型复合名字对象 如果另一个名字对象是复合对象,则此方法将每个复合的分量从左到右进行比较。 返回的常见前缀名字对象也可能是复合名字对象,具体取决于两个名字对象共有的最左侧组件的数量。 如果另一个名字对象不是复合对象,该方法只需将其与此名字对象的最左侧组件进行比较。

如果名字对象相等,该方法将返回MK_S_US并将 ppmkPrefix 设置为此名字对象。 如果其他名字对象是此名字对象的前缀,该方法将返回MK_S_HIM并将 ppmkPrefix 设置为其他名字对象。 如果此名字对象是另一个名字对象的前缀,此方法将返回MK_S_ME并将 ppmkPrefix 设置为此名字对象。

如果没有常见的前缀,此方法将返回MK_E_NOPREFIX并将 ppmkPrefix 设置为 NULL

项名字对象 如果另一个名字对象是等于此名字对象的项目名字对象,则此方法将 *ppmkPrefix 设置为此名字对象,并返回MK_S_US;否则,该方法调用 MonikerCommonPrefixWith 函数。 此函数正确处理其他名字对象是泛型复合的情况。
OBJREF 名字对象 如果两个名字对象相等,此方法将返回MK_S_US并将 *ppmkPrefix 设置为 NULL。 如果其他名字对象不是 OBJREF 名字对象,此方法会将这两个名字对象传递给 MonikerCommonPrefixWith 函数。 此函数正确处理其他名字对象是泛型复合的情况。

如果没有常见的前缀,此方法将返回MK_E_NOPREFIX。

指针名字对象 如果两个名字对象相等,此方法将返回MK_S_US并将 *ppmkPrefix 设置为此名字对象。 否则,该方法将返回MK_E_NOPREFIX并将 *ppmkPrefix 设置为 NULL
URL 名字对象 此方法返回E_NOTIMPL。

要求

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

另请参阅

IMoniker

MonikerCommonPrefixWith