Microsoft поставляет класс CMFCShellTreeCtrl
для просмотра иерархии пространства имен оболочки (по сути то же самое, что и левая часть окна проводника).
Этот элемент управления использует SHGetPathFromIDList()
чтобы перейти от списка идентификаторов элементов к строковому представлению текущего пути (выбранного элемента).
Можно установить его текущий элемент, используя любую строку, которая в конечном итоге соответствует его внутренней иерархии оболочки, даже если задействованные объекты находятся не «в файловой системе» — например, \\WOLF
выберет компьютер WOLF под узлом Networking (при условии, что в вашей локальной сети есть компьютер с именем WOLF).
Тем не менее, интерфейс отвечает пустой строкой, когда вы пытаетесь получить такой путь обратно от элемента управления из-за его зависимости от SHGetPathFromIDList()
который не разрешает элементы оболочки, которые не находятся в файловой системе.
Кто-нибудь знает о реализации лучшего ImprovedSHGetPathFromIDList()
это работает с ITEMIDLIST, которые не находятся в файловой системе (например, \ WOLF)?
Я мог бы предоставить свою собственную версию SelectPath()
а также GetItemPath()
для самого элемента управления деревом оболочки, реализуя мою собственную версию списка ITEMIDLIST <-> строковая логика, чтобы они были полностью симметричными (т.е. я бы хотел, чтобы GetItemPath () возвращал тот же путь, который использовался для успешного выбора SelectPath () ранее — или для любого узла в древовидном представлении).
Тем не менее, это может быть использовано в другом месте, как в общем улучшенная двусторонняя передача между путевыми именами и списками ITEMIDLIST (в конце концов, UNC-имена — это достаточно распространенный способ выражения пути к файловой системе!)
AFAIK, нет готовой функции для элементов, не относящихся к файловой системе. Вы должны были бы перебрать ITEMIDLIST
с помощью IShellFolder::GetDisplayNameOf()
на каждом предмете, указав SIGDN_PARENTRELATIVEPARSING
или же SIGDN_DESKTOPABSOLUTEPARSING
флаг, чтобы создать строку пути вручную.
Других решений пока нет …