Определение пути к Windows Desktop и другим специальным каталогам.


Ответ

Используйте 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(); } } //---------------------------------------------------------------------

Ниже показан рисунок с примером работы этой функции для различных каталогов системы.



Рисунок 1. Результат использования функции SHGetSpecialFolder

Примечание: Обратите внимание, что некоторые из имен путей — пусты. Некоторые из специальных папок в оболочке не имеют соответствующего каталога в файловой системе.

Примечание: Тема Диалог выбора папки пользователем содержит объяснение работы SHGetMalloc.


Copyright © 1997-2000 by Harold Howe. bcbdev.com
All rights reserved.
Переведено для сайта http://cbuilder.ru