Интерфейс IShellFolder
Этот интерфейс соответствует папке – одному из основных элементов пространства имен Проводника. Зачем было вводить термин "папка", когда существовали уже общепринятые "каталог" и "директория"? В отличие от последних двух, папка может быть не просто обычным элементом файловой системы. Она может быть виртуальной – как папки Принтеры, Документы или Панель управления. Любая папка может содержать коллекцию объектов из состава пространства имен.
Получив указатель на интерфейс ishellFoider, соответствующий папке, вы можете работать с ней, как с объектом СОМ. "Верхушкой" (корневой папкой) пространства имен является папка Рабочий стол (Desktop). Получить интерфейс isheiiFoider этой папки можно путем вызова функции:
function SHGetDesktopFolder(var ppshf: IShellFolder): HResult;
Логика работы с описываемым интерфейсом такова: сначала необходимо получить интерфейс нужной папки, а затем можно переходить к работе с ее содержимым. Содержимое представляет собой список, а каждый элемент папки представлен структурой pitemiDList. Эта структура не типизирована; ее единственное обязательное поле содержит длину в байтах, зная которую можно переместиться к следующему элементу. То есть получается обычная цепочка. Все остальные поля заполняются соответствующими функциями и методами интерфейса ishellFoider.
Примечание
Все служебные функции работы со структурами PitemiDList – создание, уничтожение, копирование, перемещение по цепочке и т. п. – содержатся в примере Virtual ListView, поставляемом с Delphi. Если вы намерены писать программы, работающие с ishellFoider, целесообразно взять их на заметку. В дальнейшем для простоты эти структуры будем именовать pidl.
Рассмотрим функции интерфейса ishellFoider. Под "текущей папкой" в табл. 31.1 понимается та папка, которая в данный момент представляет интерфейс IShellFolder.
Таблица 31.1. Функции интерфейса IShellFolder.
Метод | Описание |
---|---|
function ParseDisplayName (hwndOwner: HWND; pbcReserved: Pointer; IpszDisplayName: POLESTR; out pchEaten: ULONG; out ppidl: PitemiDList; var dwAttributes: ULONG): HResult; | Эта функция позволяет получить указатель на элемент ppidl, зная только его полное имя (с путем) IpszDisplayName |
function EnumObjects (hwndOwner: HWND; grf Flags: DWORD; out EnumlDList: lEnumlDList): HResult; | Возвращает указатель на специальный интерфейс lEnumlDList, предназначенный для организации цикла по всем элементам списка в текущей папке |
function BindToObject (pidl: PitemiDList; pbcReserved: Pointer; const riid: TIID; out ppvOut: Pointer): HResult; | Возвращает интерфейс папки pidl, которая должна находиться в текущей папке (на которую ссылается интерфейс, вызвавший этот метод) |
function ComparelDs (IParam: LPARAM; pidll, pid!2: PitemiDList): HResult; | Сравнивает два первых элемента В списках pidll И pidl2 |
function CreateViewObject (hwndOwner: HWND; const riid: TIID; out ppvOut: Pointer): HResult; | Создает визуальный объект для текущей папки и возвращает указатель на него в параметре ppvOut |
function GetAttributesOf (cidl: UINT; var apidl: PItemlDList; var rgflnOut: UINT): HResult; | Возвращает атрибуты элемента под номером cidl в списке apidl. Результат – набор флагов, устанавливаемых в параметре rgf inOut |
function GetUIObjectOf (hwndOwner: HWND; cidl: UINT; var apidl: PItemlDList; const riid: TIID; prgflnOut: Pointer; out ppvOut: Pointer): HResult; | Создает объект пользовательского интерфейса, связанный с элементом списка aplidl под номером cidl |
function GetDisplayNameOf (pidl: PItemlDList; uFlags: DWORD; var IpName: TStrRet): HResult; | Возвращает имя элемента pidl. Полнота возвращаемой информации определяется параметром uFlags |
function SetNaraeOf (hwndOwner: HWND; pidl: PItemlDList; IpszName: POLEStr; uFlags: DWORD; var ppidlOut: PItemlDList): HResult; | Задает новое имя IpszName для списка pidl. При этом возвращается новый указатель на список – ppidlOut |