Иллюстрированный самоучитель по Delphi 7 для профессионалов

Интерфейс 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.