IMoniker::RelativePathTo
Supplies a
moniker that, when composed onto the end of this moniker (or one with a similar
structure), yields the specified moniker.
HRESULT RelativePathTo(
IMoniker *pmkOther, |
//Pointer to moniker to which a relative path should
be taken |
IMoniker
**ppmkRelPath |
//Indirect pointer to the relative moniker |
); |
|
Parameters
pmkOther
[in] Pointer
to the IMoniker interface on the moniker to which a relative path should
be taken.
ppmkRelPath
[out]
Iindirect pointer to the IMoniker interface on the relative moniker.
When successful, the implementation must call IUnknown::AddRef
Return Values
The
method supports the standard return values E_OUTOFMEMORY and
E_UNEXPECTED,
as well as the following:
S_OK
A meaningful
relative path has been returned.
MK_S_HIM
No common
prefix is shared by the two monikers and the moniker returned in ppmkRelPath
is pmkOther.
MK_E_NOTBINDABLE
This moniker
is a relative moniker, such as an item moniker. This moniker must be composed
with the moniker of its container before a relative path can be determined.
Remarks
A relative
moniker is analogous to a relative path (such as ..\backup ). For example,
suppose you have one moniker that represents the path
c:\projects\secret\art\pict1.bmp and another moniker that represents the path
c:\projects\secret\docs\chap1.txt. Calling IMoniker::RelativePathTo on
the first moniker, passing the second one as the pmkOther parameter,
would create a relative moniker representing the path ..\docs\chap1.txt.
Notes to Callers
Moniker
clients typically do not need to call IMoniker::RelativePathTo. This
method is primarily called by the default handler for linked objects. Linked
objects contain both an absolute and a relative moniker to identify the link
source (this enables link tracking if the user moves a directory tree
containing both the container and source files). The default handler calls this
method to create a relative moniker from the container document to the link
source (that is, it calls IMoniker::RelativePathTo on the moniker
identifying the container document, passing the moniker identifying the link
source as the pmkOther parameter).
If you do
call IMoniker::RelativePathTo, call it only on absolute monikers; for
example, a file moniker or a composite moniker whose leftmost component is a
file moniker, where the file moniker represents an absolute path. Do not call
this method on relative monikers.
Notes to Implementers
Your
implementation of IMoniker::RelativePathTo should first determine
whether pmkOther is a moniker of a class that you recognize and for
which you can provide special handling (for example, if it is of the same class
as this moniker). If so, your implementation should determine the relative
path. Otherwise, it should pass both monikers in a call to the MonikerRelativePathTo
The first
step in determining a relative path is determining the common prefix of this
moniker and pmkOther. The next step is to break this moniker and pmkOther
into two parts each, say (P, myTail) and (P, otherTail) respectively, where P
is the common prefix. The correct relative path is then the inverse of myTail
composed with otherTail:
Comp( Inv(
myTail ), otherTail )
Where Comp()
represents the composition operation and Inv() represents the inverse
operation.
Note that for
certain types of monikers, you cannot use your IMoniker::Inverse
See Also