Используйте API функцию SHGetSpecialFolder. SHGetSpecialFolder
определена в SHLOBJ.H. Эта функция позволяет Вам отыскивать pidl для
различных каталогов в оболочке, типа рабочего стола Windows, стартового каталога,
и папки Мои Документы. Как только Вы получите pidl, Вы сможете преобразовать
pidl в строку пути через API-функцию SHGetPathFromIDList.
SHGetSpecialFolder имеет три параметра. Первый параметр — HWND, который определяет
окно владельца для любых диалоговых окон или окон сообщения, которые могли бы
появиться в течение вызова(я не уверен, почему диалоговое окно появилось бы).
Второй параметр — целочисленный идентификатор, который определяет, какую папку
Вы пробуете найти.
Возможные значения:
Последний параметр — адрес pidl. SHGetSpecialFolderLocation пишет результат pidl по этому адресу. Пример кода ниже демонстрирует, как использовать SHGetSpecialFolderLocation.
#define NO_WIN32_LEAN_AND_MEAN
#include <SHLOBJ.H> // разместить выше всего в Unit1.cpp
//---------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { LPITEMIDLIST pidl; LPMALLOC pShellMalloc; char szDir[MAX_PATH]; // SHGetSpecialFolderLocation генерирует PIDL. Память для PIDL
// распределяет оболочка shell, и должна быть освобождена,
// используя указатель памяти оболочки COM-объекта
// Используем SHGetMalloc, чтобы отыскать объект malloc
if(SUCCEEDED(SHGetMalloc(&pShellMalloc))) { // если все прошло успешно, продолжим
// получив pidl для рабочего стола ( windows desktop)
if(SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOPDIRECTORY, &pidl))) { // в случае успеха функция вернет true
if(SHGetPathFromIDList(pidl, szDir)) { // путь к папке поместим в Label1->Caption Label1->Caption = szDir; } pShellMalloc->Free(pidl); } pShellMalloc->Release(); } } //---------------------------------------------------------------------
Ниже показан рисунок с примером работы этой функции для различных каталогов системы.
Примечание: Обратите внимание, что некоторые из имен путей — пусты. Некоторые из специальных папок в оболочке не имеют соответствующего каталога в файловой системе.
Примечание: Тема Диалог выбора папки пользователем содержит объяснение работы SHGetMalloc.