Инициализация расширений оболочки
Практически все расширения оболочки перед вызовом рабочих процедур инициализируются. Суть инициализации состоит в том, что расширению оболочки передается информация о файле или файлах, с которыми им придется работать.
Условно расширения можно разделить на два типа: расширения, которые могут работать одновременно только с одним файлом, и расширения, которые могут работать одновременно с несколькими файлами. Примером расширения первого типа является Thumbnail handler, примером расширения второго типа является Context menu handler.
Методика инициализации расширений первого типа в Windows Vista и более новых версиях Windows значительно изменилась по сравнению со старыми версиями Windows. Если ранее расширение оболочки инициализировалось только путем передачи ему имени файла, то в Windows 7 стала возможной инициализация расширения путем передачи ему потока с содержимым файла вместо имени. Последний вариант считается более предпочтительным, поскольку это позволяет оболочке передать в расширение в том числе и объект, не являющийся частью файловой системы, например, файл из архива, или почтовое вложение.
Библиотека Shell Ace полностью поддерживает все способы инициализации, как передачей имени файла, так и передачей потока с содержимым файла. Реализованы следующие интерфейсы (указаны в порядке приоритета при их выборе в старших версиях Windows):
- IInitializeWithStream
- IPersistStream
- IInitializeWithItem
- IParentAndItem
- IInitializeWithFile
- IPersistFile
Список интерфейсов, доступных для оболочки Windows, формируется динамически, и зависит от того, какие из рабочих методов расширения перекрыты. Если, например, в расширении Thumbnail handler будет перекрыт метод CreateBitmapFromFileName, а метод CreateBitmapFromStream перекрыт не будет, то будут доступны только интерфейсы IInitializeWithFile и IPersistFile, и соответственно оболочка Windows будет знать, что расширение может работать только с реальными файлами. Если же будет перекрыт метод CreateBitmapFromStream, то будут доступны все шесть интерфейсов, при этом в случае инициализации именем файла библиотека Shell Ace самостоятельно создаст поток и передаст его в CreateBitmapFromStream.
Инициализация расширений второго типа производится через интерфейс IShellExtInit. При этом в расширение передается интерфейс IDataObject, из которого можно извлечь список файлов. В библиотеке Shell Ace можно получить список файлов, вызвав функцию CreateCurrentFileList, которая создаст объект класса TStrings со списком файлов.
Смотрите также:
- Что такое расширение оболочки
- Какие бывают расширения оболочки
- Как создать расширение оболочки
- Инициализация расширений оболочки
- Как создать расширение оболочки Context menu
- Как создать расширение оболочки Drag and drop context menu
- Как создать расширение оболочки Drop target
- Как создать расширение оболочки Icon
- Как создать расширение оболочки Info tip
- Как создать расширение оболочки Overlay icon
- Как создать расширение оболочки Preview
- Как создать расширение оболочки Property sheet
- Как создать расширение оболочки Property store
- Как создать расширение оболочки Thumbnail
- Как зарегистрировать расширение оболочки
- Как отлаживать расширение оболочки
- Использование логов