Каковы все известные GUID виртуальных папок? - PullRequest
12 голосов
/ 21 января 2010

Кажется, есть несколько виртуальных папок, с которыми связаны GUID (панель управления, рабочий стол) -

:: {00021400-0000-0000-c000-000000000046} // рабочий стол

Где они определены? Когда они используются?

Мне нужен способ получить строку, которая представляет виртуальную папку без какой-либо двусмысленности.

Если, например, я должен был создать PIDL для рабочего стола, отображаемое имя возвращается как «C: \ Users \ Steve \ Desktop».

Ну, это правда на данный момент - но это не совсем правильная папка. Я могу перейти в Проводнике к этой папке, и она содержит часть файлов на моем рабочем столе, а не весь рабочий стол.

Мне нужен способ кодирования этого местоположения в виде строки, которая всегда будет перемещаться в папку виртуального рабочего стола (ту, в которой есть все ее содержимое, а не только несколько вещей).

Кто-нибудь знает точный список таких GUID? Или как я могу преобразовать данный PIDL в один?

Я попробовал SHGetDisplayName (pidl, SHGDN_ *) - каждая версия этого для настольного pidl дает мне короткий «Рабочий стол» или «C: \ Users \ Steve \ Desktop». (Я вошел в систему под учетной записью «steve», очевидно).

Идеи / комментарии / указатели?

РЕДАКТИРОВАТЬ: Похоже, что я могу использовать приведенные ниже ответы, чтобы получить список известных графических интерфейсов папок. Но кто-нибудь знает программно, как конвертировать из PIDL -> известную папку GUID? Я предполагаю, что могу получить ParseDisplayName (":: {guid}"), чтобы получить PIDL, но есть ли способ получить GUID?

EDIT2: Я все еще не могу найти способ получить GUID программно. Однако для моих целей я записываю CSIDL_xxx, который я использую для первоначального создания объекта, и записываю его и восстанавливаю позже, а затем создаю PIDL с помощью CSIDL, который сохраняет свою правильную идентичность (т.е. не превращается в «C: \ Users \\ Desktop», а скорее генерирует PIDL, который действительно указывает на виртуальный рабочий стол.

Хитрость для меня состоит в том, чтобы всегда использовать CSIDL-> PIDL, никогда не переходя на строку между ними. CSIDL-> PIDL-> string-> PIDL = вырождение в не виртуальный путь.

Спасибо всем за помощь - и я буду продолжать искать, если кто-нибудь найдет больше по теме и опубликует ее, мне было бы интересно! ;)

Ответы [ 2 ]

5 голосов
/ 21 января 2010

Если я правильно вас понимаю, вы ищете CSIDL s (до Vista, включая Shlobj.h) или KNOWNFOLDERID (> = Vista, Knownfolders.h).

1 голос
/ 21 января 2010

Я не думаю, что эти GUID официально задокументированы. Вы можете использовать SHGetPathFromIDList (), чтобы получить GUID. Это будет указывать на ошибку, но если вы посмотрите на параметр pszPath, вы увидите, что он заполнен GUID (однако первый символ установлен в NULL). Кроме того, вы можете найти различные списки GUIDS, обнаруженные другими людьми.

РЕДАКТИРОВАТЬ: я нашел несколько интересных ссылок; кажется, вы можете обнаружить эти GUID, выполнив поиск в реестре.

Публикация форума о GUID оболочки

GUID панели управления

Как установлены пространства имен оболочки

...