IMoniker::CommonPrefixWith 方法 (objidl.h)

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

语法

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

参数

[in] pmkOther

指向另一个名字对象上的 IMoniker 接口的指针,要与此名字对象进行比较,以确定是否存在公共前缀。

[out] ppmkPrefix

接收指向作为此名字对象和 pmkOther 公共前缀的名字对象的接口指针的 IMoniker* 指针变量的地址。 成功后,实现必须对生成的名字对象调用 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 是否是你识别的类的名字对象,并且你可以为其提供特殊处理 (例如,如果它与这个名字对象) 属于同一类。 如果是这样,实现应确定两个名字对象的通用前缀。 否则,它应在调用 MonikerCommonPrefixWith 函数时传递这两个名字对象,该函数可正确处理泛型大小写。

特定于实现的说明

实现 备注
反名字对象 如果另一个名字对象也是反名字对象,该方法将返回MK_S_US并将 ppmkPrefix 设置为此名字对象。 否则, 方法调用 MonikerCommonPrefixWith 函数。 此函数可正确处理另一个名字对象为泛型复合的情况。
类名字对象 如果 pmkOther 等于此名字对象,则 检索指向此名字对象的指针并返回MK_S_US。 如果 pmkOther 是类名字对象,但不等于此名字对象,则 返回MK_E_NOPREFIX。 否则,返回调用 MonikerCommonPrefixWith 的结果,其本身为 pmkThispmkOtherppmkPrefix,后者处理 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