В качестве примера использования SHGetSpecialFolderPath() рассмотрим процедуру, заполняющую Memo-поле информацией о специальных папках Windows.
Задачу преобразования полученного идентификатора PIDL в путь и имя файла решает другая функция:
WiffitmWil /Ш/J fucntion SHGetPathFromIDList(pidl : PItemIDList; var pszPath : PChar): boolean;
В качестве первого параметра следует направлять идентификатор папки. Второй параметр - указатель на буфер, в который метод передаст привычный нам путь к объекту. Признаком успешного выполнения функции станет возвращаемое ею значение true.
Интерфейс папки - IShellFolder
Мы уже упоминали, что все объекты пространства имен оболочки являются объектами COM и общаются с миром посредством своих интерфейсов. Наконец настала очередь знакомства с наиболее интересным элементом оболочки -папкой. Вне зависимости от того, является ли папка физическим каталогом или представляет собой виртуальный элемент, она описывается в рамках единого интерфейса, именуемого IShellFolder.
IShellFolder = interface(IUnknown)
Изучение интерфейса начнем с ответа на вопрос: «Каким образом можно получить указатель на интерфейс из программного кода?»
Открыв Проводник Windows (рис. 29.1), мы увидим, что корневой папкой, порождающей все дерево папок пространства имен, назначен рабочий стол Windows. Поэтому в Win32 API реализована функция, специализирующаяся на получении интерфейса именно рабочего стола:
function SHGetDesktopFolder(var pSF: IShellFolder) : HRESULT;
Полученный указатель на интерфейс передается в единственный параметр метода - pSF. Результат выполнения метода сигнализирует о том, успешно или не совсем (значение меньше нуля) завершился его вызов.
uses ShlObj;
var iDesktop: IShellFolder;
SHGetDesktopFolder(iDesktop);
Интерфейс рабочего стола Windows служит той самой точкой опоры, благодаря которой мы если и не перевернем Землю, то, по крайней мере, сможем обращаться ко всем принадлежащим рабочему столу папкам.
ОНапомню, что для обработки результатов типа HRESULT, возвращаемых методами объектов COM, в модуле ComObj Delphi предусмотрена специальная процедура:
procedure OleCheck(ECode: HResult); Задача процедуры - генерация исключительной ситуации EOleSysError в случае некорректного завершения метода.
var iSF: IShellFolder;
OLECheck(SHGetDesktopFolder(iSF)); Но далее, в листингах примеров, мы отказываемся от применения этой процедуры исключительно ради повышения удобочитаемости кода.