Jenter Алекс
Шрифт:
За размещение списков идентификаторов отвечает распределитель памяти оболочки (Shell's allocator), предоставляющий интерфейс IMalloc. Указатель на данный интерфейс распределителя памяти оболочки можно получить через метод SHGetMalloc.
Таким образом, если Ваше приложение получает от оболочки PIDL-указатель, то оно становится ответственным за обязательное в дальнейшем освобождение этого списка с помощью распределителя памяти оболочки.
Ниже представлен пример копирования списка идентификаторов:
Для увеличения эффективности работы Ваших приложений рекомендуется брать ссылку на распределитель памяти оболочки при запуске приложения, и освобождать эту ссылку при выходе из приложения.
Интерфейс IShellFolder предоставляет метод CompareIDs для определения расположения двух идентификаторов относительно друг друга (выше, ниже или равны) в данной папке. При этом параметр lParam определяет критерий упорядочивания, но заранее определённым для всех объектов-папок является только сортировка по имени (значение 0). Если вызов этого метода завершён успешно, то поле CODE возвращаемого значения содержит ноль при равенстве объектов, отрицательно, если первое меньше второго, и положительно в обратном случае.
Некоторые папки имеют особое значение для оболочки. Для нахождения этих специальных папок, а также для того, чтобы пользователь мог сам искать необходимые ему папки, оболочка предоставляет специализированный набор функций:
| SHGetDesktopFolder | Возвращает интерфейс IShellFolder объекта-папки "Рабочий стол" (Desktop); |
| SHGetSpecialFolderLocation | Возвращает указатель на список идентификаторов специального объекта-папки. |
| SHBrowseForFolder | Проводит диалог с пользователем и возвращает указатель на список идентификаторов выбранного пользователем объекта-папки; |
| SHGetSpecialFolderPath | Версия 4.71. Возвращает путь файловой системы для специального объекта-папки. Функция предназначена для работы со специальными папками, а не для работы с виртуальными. |
При отсутствии нужной папки может, по требованию приложения, её создавать.
Каждый объект-папка прдоставляет Вам возможность перебора всех объектов, которыми данный объект владеет. Для этого Вам предоставляется метод EnumObjects интерфейса IShellFolder, который возвращает интерфейс-итератор IEnumIDList. При этом Вы можете ограничить список (включать папки, не папки, скрытые и системные объекты).
Описание методов интерфейса IEnumIDList:
| Clone | Создаёт новый объект-итератор, идентичный данному; |
| Next | Восстанавливает указанное количество идентификаторов элементов, находящихся в папке; |
| Reset | Возвращает итератор к началу последовательности; |
| Skip | Пропускает указанное количество элементов; |
Таким образом Вы сможете получить набор указателей на списки идентификаторов, причём эти списки будут относительными по отношению к папке-владельцу.