2013-03-15 2 views
4

Microsoft поставляет класс CMFCShellTreeCtrl для просмотра иерархии пространства имен оболочки (по сути, то же самое, что и левая сторона окна проводника).Есть ли лучший способ преобразования itemidlist в строку пути, чем SHGetPathFromIDList()?

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

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

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

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


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

Однако, это может иметь применение в других местах, как обобщенно улучшения поездка туда и обратно между имен путей и ITEMIDLISTs (в конце концов, имена UNC являются достаточно распространенным способом выразить путь fielsystem!)

ответ

2

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

+0

не могли бы вы предоставить краткий пример, пожалуйста? – Victor

+0

@ Victor Я сейчас не на компьютере. Но вкратце, вам придется ходить по пунктам в 'ITEMIDLIST'. Начните с 'IShellFolder', что' ITEMIDLIST' относится к ('SHGetDesktopFolder()' для абсолютного 'ITEMIDLIST'). Для первого элемента в списке используйте 'IShellFolder :: GetDisplayNameOf()', чтобы получить его строку, и 'IShellFolder :: BindToObject()', чтобы получить интерфейс 'IShellFolder'. Затем повторите для каждого последующего элемента в списке, объединяя строки вместе, пока список не будет исчерпан. –

 Смежные вопросы

  • Нет связанных вопросов^_^