"Синие страницы DELPHI" на Кудрявцев.народ.ру | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Пространство
имён оболочки Windows
|
|
|
За размещение списков идентификаторов обычно отвечает распределитель памяти оболочки (Shell's allocator), предоставляющий интерфейс IMalloc. Указатель на данный интерфейс распределителя памяти оболочки можно получить через метод SHGetMalloc.
Таким образом, если Ваше приложение получает от оболочки PIDL, то оно становится ответственным за освобождение этого списка с помощью распределителя памяти оболочки.
Ниже представлен пример копирования списка идентификаторов (функции написаны неоптимально, но это всего лишь рабочий пример):
|
|
Для увеличения эффективности работы Ваших приложений рекомендуется брать ссылку на распределитель памяти оболочки при запуске приложения, и освобождать эту ссылку при выходе из приложения.
Интерфейс IShellFolder предоставляет метод CompareIDs для определения расположения двух идентификаторов относительно друг друга (выше, ниже или равны) в данной папке. При этом могут использоваться различные критерии упорядочивания, но заранее определённым для всех объектов-папок является только сортировка по имени (значение 0).
Некоторые папки имеют особое значение для оболочки. Чтобы найти эти специальные папки, а также чтобы пользователь мог сам искать необходимые ему папки, оболочка предоставляет специализированный набор функций:
SHGetDesktopFolder | Возвращает интерфейс IShellFolder объекта-папки "Рабочий стол" (Desktop); |
SHGetSpecialFolderLocation | Возвращает указатель на список идентификаторов специального объекта-папки. |
SHBrowseForFolder | Проводит диалог с пользователем и возвращает указатель на список идентификаторов выбранного пользователем объекта-папки; |
SHGetSpecialFolderPath | Версия
4.71. Возвращает путь
файловой системы для
специального объекта-папки.
Функция предназначена для
работы со специальными
папками, а не для работы с виртуальными.
При отсутствии нужной папки может, по требованию приложения, её создавать. |
Для указания необходимой специальной папки функции SHGetSpecialFolderLocation и SHGetSpecialFolderPath принимают в качестве параметра одно из ниже указанных значений:
CSIDL_DESKTOP | Рабочий
стол (Desktop) для данного
пользователя; Виртуальная папка, являющаяся корнем основного пространства имён оболочки |
CSIDL_INTERNET | Интернет
(Internet); Виртуальная папка, представляющая пространство Internet |
CSIDL_PROGRAMS | Программы
(Programs) для данного
пользователя; Каталог файловой системы, содержащий в себе группы программ пользователя, также являющиеся каталогами файловой системы |
CSIDL_CONTROLS | Панель
управления (Control Panel); Виртуальная папка, содержащая в себе набор иконок панели управления |
CSIDL_PRINTERS | Принтеры
(Printers); Виртуальная папка, содержащая в себе инсталлированные принтеры |
CSIDL_PERSONAL | Мои
документы (My Documents); Каталог файловой системы, служащий общим репозиторием для документов |
CSIDL_FAVORITES | Избранное
(Favorites) для данного
пользователя; Каталог файловой системы, служащий общим репозиторием избранных пользователем элементов |
CSIDL_STARTUP | Автозагрузка
(Startup) для данного
пользователя; Каталог файловой системы, который является пользовательской папкой программ "Автозагрузка". Система запускает эти программы каждый раз, когда данный пользователь входит в Windows NT, или когда стартует Windows 95/98 |
CSIDL_RECENT | Документы
(Documents); Каталог файловой системы, содержащий в себе ссылки на самые последние документы, с которыми недавно работал пользователь |
CSIDL_SENDTO | Отправить
(Send To); Каталог файловой системы, содержащий в себе пункты меню Send To |
CSIDL_BITBUCKET | Корзина (Recycle Bin); |
CSIDL_STARTMENU | Главное
меню (Start menu) для данного
пользователя; Каталог файловой системы, содержащий в себе пункты меню Start |
CSIDL_DESKTOPDIRECTORY | Каталог файловой системы, хранящий файловые объекты Рабочего стола (Desktop directory) для данного пользователя; |
CSIDL_DRIVES | Мой
компьютер (My computer); Виртуальная папка, содержащая в себе всё, что находится на локальном компьютере: устройства хранения, принтеры и панель управления. Эта папка может также содержать в себе спроецированные сетевые диски |
CSIDL_NETWORK | Сетевое
окружение (Network Neighborhood); Виртуальная папка, представляющая верхний уровень иерархии сети |
CSIDL_NETHOOD | Каталог файловой системы, хранящий файловые объекты Сетевого окружения (Network Neighborhood); |
CSIDL_FONTS | Шрифты
(Fonts); Виртуальная папка, содержащая шрифты |
CSIDL_TEMPLATES | Шаблоны
(Templates); Каталог файловой системы, служащий общим репозиторием шаблонов документов (пункт контекстного меню оболочки "Создать") |
CSIDL_COMMON_STARTMENU | Каталог файловой системы, содержащий в себе общие пункты меню Start, которые появляются у всех пользователей; |
CSIDL_COMMON_PROGRAMS | Каталог файловой системы, содержащий в себе общие группы программ пользователя, которые появляются у всех пользователей; |
CSIDL_COMMON_STARTUP | Каталог файловой системы, содержащий в себе общие программы, которые появляются в папке Startup для всех пользователей; |
CSIDL_COMMON_DESKTOPDIRECTORY | Каталог файловой системы, хранящий общие файловые объекты Рабочего стола (Desktop directory), которые появляются на рабочих столах всех пользователей; |
CSIDL_APPDATA | Каталог файловой системы, служащий общим репозиторием данных, специфичных для приложения; |
CSIDL_PRINTHOOD | Каталог файловой системы, служащий общим репозиторием ссылок на принтеры; |
CSIDL_ALTSTARTUP | Каталог файловой системы, который является нелокализованной пользовательской папкой программ "Автозагрузка". |
CSIDL_COMMON_ALTSTARTUP | Каталог файловой системы, содержащий в себе общие программы, которые появляются в нелокализованной папке Startup для всех пользователей; |
CSIDL_COMMON_FAVORITES | Каталог файловой системы, содержащий в себе общие избранные элементы, которые появляются в папке "Избранное" у всех пользователей; |
CSIDL_INTERNET_CACHE | Каталог файловой системы, служащий общим репозиторием для временного хранения файлов, кэшируемых при работе с Internet; |
CSIDL_COOKIES | Каталог файловой системы, служащий общим репозиторием для Internet Cookies; |
CSIDL_HISTORY | Каталог файловой системы, служащий общим репозиторием для хранения истории работы с Internet. |
Функция SHBrowseForFolder позволяет ограничить видимое пространство имён, задав в поле pidlRoot корневую папку, с которой будет идти просмотр (по умолчанию - "Рабочий стол"), и указав типы объектов, которые приемлемы в качестве выбранных, в поле ulFlags.
Описание флагов, которые допустимы в поле ulFlags:
BIF_BROWSEFORCOMPUTER | В качестве выбора допустимы только компьютеры. |
BIF_BROWSEFORPRINTER | В качестве выбора допустимы только принтеры. |
BIF_BROWSEINCLUDEFILES | В диалоговом окне, помимо папок, будут также представлены и файлы. |
BIF_DONTGOBELOWDOMAIN | Не показывать сетевые папки, расположенные ниже уровня домена. |
BIF_EDITBOX | Версия 4.71. В диалоговом окне будет присутствовать строка редактирования, таким образом пользователь может набрать имя элемента. |
BIF_RETURNFSANCESTORS | В качестве выбора допустимы только объекты, представленные в файловой системе. |
BIF_RETURNONLYFSDIRS | В качестве выбора допустимы только каталоги файловой системы. |
BIF_STATUSTEXT | В диалоговом окне появится строка статуса, функция обратного вызова сожет устанавливать текст в этой строке с помощью посылки сообщений диалоговому окну. |
BIF_VALIDATE | Версия 4.71. Если пользователь введёт неверное имя в строке редактирования, то диалоговое окно вызовет функцию обратного вызова приложения по сообщению BFFM_VALIDATEFAILED. |
Ниже представлен пример работы с функцией SHBrowseForFolder на Delphi. Очень часто приложение использует функцию обратного вызова, чтобы указать исходную папку для просмотра. Здесь мы будем использовать механизм обратного вызова именно для этой цели, а также для того, чтобы установить некий текст при инициализации диалога:
|
В вышеприведённом коде есть некоторые моменты, которые будут разьяснены ниже.
Каждый объект-папка прдоставляет Вам возможность перебора всех объектов, которыми данный объект владеет. Для этого Вам предоставляется метод EnumObjects интерфейса IShellFolder, который возвращает интерфейс-итератор IEnumIDList. При этом Вы можете ограничить список (включать папки, не папки, скрытые и системные объекты).
Описание методов интерфейса IEnumIDList:
Clone | Создаёт новый объект-итератор, идентичный данному; |
Next | Восстанавливает указанное количество идентификаторов элементов, находящихся в папке; |
Reset | Возвращает итератор к началу последовательности; |
Skip | Пропускает указанное количество элементов; |
Таким образом Вы сможете получить набор указателей на списки идентификаторов, причём эти списки будут относительными по отношению к папке-владельцу.
Чтобы получить интерфейс IShellFolder для любого из этих объектов, Вам потребуется осуществить привязку, вызвав метод BindToObject интерфейса IShellFolder папки-владельца.
Чтобы узнать атрибуты данного объекта или нескольких объектов, необходимо вызвать метод GetAttributesOf интерфейса IShellFolder папки-владельца. При этом перед вызовом этого метода необходимо установить те атрибуты, значения которых Вы бы хотели выяснить. Если запрошены атрибуты нескольких элементов, то метод вернёт только те значения атрибутов, которые совпадают у всех переданных элементов. В частности, Вы сможете взять интерфейс IShellFolder только от тех объектов, которые имеют атрибут SFGAO_FOLDER. Вы можете обновить информацию об элементах, входящих в папку, использовав флаг SFGAO_VALIDATE. Ниже представлен пример навигации по основному пространству имён:
|
|
Прежде всего, Ваше приложение всегда можете получить строку с именем объекта, представленном в удобном для Вас формате. Для этого интерфейс IShellFolder предоставляет метод GetDisplayNameOf.
Вы можете указать один из следующих требующихся форматов:
SHGDN_NORMAL | Обычный формат представления; |
SHGDN_INFOLDER | Формат представления относительно данной папки; |
SHGDN_INCLUDE_NONFILESYS | Приложение заинтересовано в именах элементов всех типов. Если этот флаг не установлен, то приложение заинтересовано лишь в тех элементах, которые представляют часть файловой системы. Если этот флаг не установлен, и элемент не представляет собой часть файловой системы, то этот метод может быть выполнен неудачно; |
SHGDN_FORADDRESSBAR | Имя будет использовано для показа в адресном комбобоксе; |
SHGDN_FORPARSING | Формат представления, используемый для дальнейшего разбора имени; |
Имя элемента, полученное с установленным флагом SHGDN_FORPARSING, имеет особое значение. Вы можете использовать такое имя как командную строку для запуска приложения. Говоря точнее - такое имя эквивалентно понятию пути файловой системы.
Интерфейс IShellFolder предоставляет метод SetNameOf, позволяющий изменить экранное имя файлового объекта или вложенной папки. Изменяя экранное имя элемента, Вы изменяете его идентификатор, поэтому функция возвращает PIDL-указатель на новый идентификатор. Изменение экранного имени файлового объекта приводит к его фактическому переименованию в файловой системе.
Интерфейс IShellFolder также предоставляет метод ParseDisplayName, который позволяет узнать идентификатор элемента по его имени. Этому методу необходимо передавать имя, сгенерированное методом GetDisplayNameOf с установленным флагом SHGDN_FORPARSING.
С помощью глобального метода SHGetPathFromIDList по списку идентификаторов, определяющих объект относительно корня пространства имён, можно определить путь к объекту файловой системы.
С помощью глобального метода SHAddToRecentDocs Ваше приложение может добавить документ к списку последних, с которыми работал пользователь, или очистить этот список.
С помощью глобального метода SHEmptyRecycleBin, появившегося в версии 4.71 оболочки Windows, Ваше приложение может очистить корзину (Recycle Bin). Удаление файла в корзину (то есть - с возможностью дальнейшего восстановления) производится глобальным методом SHFileOperation, подробное описание которого выходит за рамки этого обзора.
Поиск интерфейсов, позволяющих оперировать с данным объектом, можно осуществить через метод GetUIObjectOf интерфейса IShellFolder (обычно запрашиваются интерфейсы контекстных меню и операций drag-and-drop).
Частой задачей является выполнение некоторых команд контекстного меню для данного элемента. Например, для открытия окна свойств объекта нужно запросить интерфейс IContextMenu этого объекта, и активизировать команду "Properties". Ниже представлен пример:
|
|
Все примеры в данном обзоре являются реально работающими (предварительно скомпилированными). Для компиляции использовались Microsoft Visual C++ 6.0 SP3 и Borland Delphi 4.0 UP3. К сожалению, при конвертации в HTML могли возникнуть маленькие погрешности, которые пока мне неизвестны.