Инициализация расширений оболочки

Практически все расширения оболочки перед вызовом рабочих процедур инициализируются. Суть инициализации состоит в том, что расширению оболочки передается информация о файле или файлах, с которыми им придется работать.

Условно расширения можно разделить на два типа: расширения, которые могут работать одновременно только с одним файлом, и расширения, которые могут работать одновременно с несколькими файлами. Примером расширения первого типа является Thumbnail handler, примером расширения второго типа является Context menu handler.

Методика инициализации расширений первого типа в Windows Vista и более новых версиях Windows значительно изменилась по сравнению со старыми версиями Windows. Если ранее расширение оболочки инициализировалось только путем передачи ему имени файла, то в Windows 7 стала возможной инициализация расширения путем передачи ему потока с содержимым файла вместо имени. Последний вариант считается более предпочтительным, поскольку это позволяет оболочке передать в расширение в том числе и объект, не являющийся частью файловой системы, например, файл из архива, или почтовое вложение.

Библиотека Shell Ace полностью поддерживает все способы инициализации, как передачей имени файла, так и передачей потока с содержимым файла. Реализованы следующие интерфейсы (указаны в порядке приоритета при их выборе в старших версиях Windows):

Список интерфейсов, доступных для оболочки Windows, формируется динамически, и зависит от того, какие из рабочих методов расширения перекрыты. Если, например, в расширении Thumbnail handler будет перекрыт метод CreateBitmapFromFileName, а метод CreateBitmapFromStream перекрыт не будет, то будут доступны только интерфейсы IInitializeWithFile и IPersistFile, и соответственно оболочка Windows будет знать, что расширение может работать только с реальными файлами. Если же будет перекрыт метод CreateBitmapFromStream, то будут доступны все шесть интерфейсов, при этом в случае инициализации именем файла библиотека Shell Ace самостоятельно создаст поток и передаст его в CreateBitmapFromStream.

Инициализация расширений второго типа производится через интерфейс IShellExtInit. При этом в расширение передается интерфейс IDataObject, из которого можно извлечь список файлов. В библиотеке Shell Ace можно получить список файлов, вызвав функцию CreateCurrentFileList, которая создаст объект класса TStrings со списком файлов.

Смотрите также: