Microsoft поставляет класс CMFCShellTreeCtrl
для просмотра иерархии пространства имен оболочки (по сути, то же самое, что и левая сторона окна проводника).Есть ли лучший способ преобразования itemidlist в строку пути, чем SHGetPathFromIDList()?
Этот элемент управления использует SHGetPathFromIDList()
, чтобы перейти из списка идентификаторов элементов в строковое представление текущего пути (выбранный элемент).
Можно установить текущий элемент с помощью любой строки, которая заканчивается соответствием ее внутренней иерархии оболочки, даже если задействованные объекты не являются «в файловой системе» - например, \\WOLF
выберет машину WOLF под узлом Networking (при условии, что в вашей локальной сети есть машина с именем WOLF).
Однако интерфейс реагирует пустой строкой, когда вы пытаетесь получить такой путь от элемента управления из-за его зависимости от SHGetPathFromIDList()
, который не будет разрешать элементы оболочки, которые не находятся в файловой системе.
Кто-нибудь знает о реализации лучшего ImprovedSHGetPathFromIDList()
, который работает с ITEMIDLIST, который arent 'в файловой системе (например, \ WOLF)?
Я мог бы обеспечить свою собственную версию SelectPath()
и GetItemPath()
для самого элемента управления оболочкой дерева, реализуя свою собственную версию ITEMIDLIST < -> строки логики, так что два были полностью симметричны (то есть я хотел GetItemPath (), чтобы вернуть тот же путь, который ранее использовался для выбора SelectPath(), или для любого узла в древовидном представлении).
Однако, это может иметь применение в других местах, как обобщенно улучшения поездка туда и обратно между имен путей и ITEMIDLISTs (в конце концов, имена UNC являются достаточно распространенным способом выразить путь fielsystem!)
не могли бы вы предоставить краткий пример, пожалуйста? – Victor
@ Victor Я сейчас не на компьютере. Но вкратце, вам придется ходить по пунктам в 'ITEMIDLIST'. Начните с 'IShellFolder', что' ITEMIDLIST' относится к ('SHGetDesktopFolder()' для абсолютного 'ITEMIDLIST'). Для первого элемента в списке используйте 'IShellFolder :: GetDisplayNameOf()', чтобы получить его строку, и 'IShellFolder :: BindToObject()', чтобы получить интерфейс 'IShellFolder'. Затем повторите для каждого последующего элемента в списке, объединяя строки вместе, пока список не будет исчерпан. –