Поделиться через


Метод 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 моникером распознаваемого класса и для которого можно предоставить специальную обработку (например, если он относится к тому же классу, что и этот моникер). В этом случае реализация должна определить относительный путь. В противном случае он должен передать оба моникера в вызове функции 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 , равным этому моникеру, pmkOther, ppmkRelPath и TRUE как 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
Header objidl.h

См. также раздел

IMoniker

MonikerRelativePathTo