Подтвердить что ты не робот

Каковы все известные GUID виртуальных папок?

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

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

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

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

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

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

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

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

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

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

EDIT: Кажется, что я могу использовать приведенные ниже ответы, чтобы иметь список GUI известных языков. Но кто-нибудь знает программно, как конвертировать из идентификатора GUID PIDL → known? Я предполагаю, что я могу ParseDisplayName ( ":: {guid}" ) получить PIDL, но есть ли способ добраться до GUID?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Я подозреваю, что вы найдете эту статью MSDN.

Ответ 3

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

EDIT: я нашел несколько интересных ссылок; кажется, вы можете обнаружить эти GUID, выполнив поиск в реестре.

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

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

Как устанавливаются пространства имен