IMoniker::RelativePathTo 方法 (objidl.h)

在此名字对象和指定名字对象之间创建相对名字对象。

语法

HRESULT RelativePathTo(
  [in]  IMoniker *pmkOther,
  [out] IMoniker **ppmkRelPath
);

参数

[in] pmkOther

指向名字对象上 IMoniker 接口的指针,应采用相对路径。

[out] ppmkRelPath

指向 IMoniker 指针变量的指针,该变量接收指向相对名字对象的接口指针。 成功后,实现必须在新名字对象上调用 AddRef ;调用方负责调用 Release。 如果发生错误,实现会将 *ppmkRelPath 设置为 NULL

返回值

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

返回代码 说明
S_OK
该方法已成功完成。
MK_S_HIM
两个名字对象不共享任何通用前缀, ppmkRelPath 中返回的名字对象为 pmkOther
MK_E_NOTBINDABLE
此名字对象是相对名字对象,例如项名字对象。 此名字对象必须与其容器的名称对象组成,然后才能确定相对路径。

注解

相对名字对象类似于相对路径 (,例如“.”。\backup“) 。 例如,假设你有一个名字对象表示路径“c:\projects\secret\art\pict1.bmp”,另一个名字对象表示路径“c:\projects\secret\docs\chap1.txt”。 在第一个名字对象上调用 RelativePathTo ,将第二个名字对象作为 pmkOther 参数传递,将创建表示路径“.”的相对名字对象。\docs\chap1.txt”。

给调用方的说明

名字对象客户端通常不需要调用 RelativePathTo。 此方法主要由链接对象的默认处理程序调用。 链接对象包含用于标识链接源的绝对和相对名字对象。 (如果用户移动包含容器和源文件的目录树,则启用链接跟踪。) 默认处理程序调用此方法以创建从容器文档到链接源的相对名字对象。 (即,它在标识容器文档的名称对象上调用 RelativePathTo ,将标识链接源的名字对象作为 pmkOther 参数传递 )

如果调用 RelativePathTo,请仅对绝对名字对象调用它,例如,文件名字对象或复合名字对象,其最左侧组件是文件名字对象,其中文件名字对象表示绝对路径。 不要对相对名字对象调用此方法。

实施者说明

RelativePathTo 的实现应首先确定 pmkOther 是否是你识别的类的名称对象,并且你可以为此提供特殊处理 (例如,如果 pmkOther 与此名字对象) 属于同一类。 如果是这样,则实现应确定相对路径。 否则,它应在调用 MonikerRelativePathTo 函数时传递这两个名字对象,该函数可正确处理泛型大小写。

确定相对路径的第一步是确定此名字对象和 pmkOther 的公用前缀。 下一步是将此名字对象和 pmkOther 分成两个部分,分别 (P、myTail) 和 (P,otherTail) ,其中 P 是通用前缀。 正确的相对路径是 myTail 与 otherTail 组合的反路径:

Comp ( Inv ( myTail ) , otherTail )

其中 Comp () 表示组合操作,Inv () 表示反运算。

对于某些类型的名字对象,不能使用 IMoniker::Inverse 方法来构造 myTail 的逆。 例如,文件名字对象将反名字对象作为反对象返回,而其 RelativePathTo 方法必须使用一个或多个表示路径“..”的文件名字对象来构造 myTail 的反对象。

特定于实现的注释

实现 备注
反名字对象 此方法返回MK_S_HIM并将 *ppmkRelPath 设置为另一个名字对象。
类名字对象 此方法返回调用 MonikerRelativePathTo 的结果,其中 pmkSrc 等于此名字对象、 pmkOtherppmkRelPathTRUE 作为 dwReserved
文件名字对象 此方法计算一个名字对象,该名字对象在此名字对象右侧组合时会生成另一个名字对象。 例如,如果此名字对象的路径为“C:\work\docs\report.doc”,并且另一个名字对象为“C:\work\art\picture.bmp”,则计算出的名字对象的路径将是“.”。\..\art\picture.bmp”。
泛型复合名字对象 此方法查找两个名字对象的公用前缀,并在删除通用前缀时创建两个由余数组成的名字对象。 然后,它为此名字对象的其余部分创建反数,并在其右侧构成另一个名字对象的其余部分。
项名字对象 此方法返回MK_E_NOTBINDABLE并将 *ppmkRelPath 设置为 NULL
OBJREF 名字对象 此方法返回E_NOTIMPL。
指针名字对象 此方法返回E_NOTIMPL。
URL 名字对象 此方法返回E_NOTIMPL。

要求

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

另请参阅

IMoniker

MonikerRelativePathTo