Есть ли лучший способ конвертировать itemidlist в строку пути, чем SHGetPathFromIDList ()?

Microsoft поставляет класс CMFCShellTreeCtrl для просмотра иерархии пространства имен оболочки (по сути то же самое, что и левая часть окна проводника).

Этот элемент управления использует SHGetPathFromIDList() чтобы перейти от списка идентификаторов элементов к строковому представлению текущего пути (выбранного элемента).

Можно установить его текущий элемент, используя любую строку, которая в конечном итоге соответствует его внутренней иерархии оболочки, даже если задействованные объекты находятся не «в файловой системе» — например, \\WOLF выберет компьютер WOLF под узлом Networking (при условии, что в вашей локальной сети есть компьютер с именем WOLF).

Тем не менее, интерфейс отвечает пустой строкой, когда вы пытаетесь получить такой путь обратно от элемента управления из-за его зависимости от SHGetPathFromIDList() который не разрешает элементы оболочки, которые не находятся в файловой системе.

Кто-нибудь знает о реализации лучшего ImprovedSHGetPathFromIDList() это работает с ITEMIDLIST, которые не находятся в файловой системе (например, \ WOLF)?


Я мог бы предоставить свою собственную версию SelectPath() а также GetItemPath() для самого элемента управления деревом оболочки, реализуя мою собственную версию списка ITEMIDLIST <-> строковая логика, чтобы они были полностью симметричными (т.е. я бы хотел, чтобы GetItemPath () возвращал тот же путь, который использовался для успешного выбора SelectPath () ранее — или для любого узла в древовидном представлении).

Тем не менее, это может быть использовано в другом месте, как в общем улучшенная двусторонняя передача между путевыми именами и списками ITEMIDLIST (в конце концов, UNC-имена — это достаточно распространенный способ выражения пути к файловой системе!)

4

Решение

AFAIK, нет готовой функции для элементов, не относящихся к файловой системе. Вы должны были бы перебрать ITEMIDLIST с помощью IShellFolder::GetDisplayNameOf() на каждом предмете, указав SIGDN_PARENTRELATIVEPARSING или же SIGDN_DESKTOPABSOLUTEPARSING флаг, чтобы создать строку пути вручную.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]