Как создать расширение оболочки Preview

Расширение Preview позволяет отображать содержимое выбранного файла в панели предпросмотра Проводника без открытия файла в какой-либо программе.

В библиотеке Shell Ace обработчик Preview реализует следующие интерфейсы:

После создания проекта расширения необходимо добавить в проект модуль с обработчиком Drop target. Для этого выберите соответствующую иконку на вкладке Shell extension:

Создание обработчика Preview

Появится окно с предложением ввести имя класса и выбрать перекрываемые методы:

Методы обработчика Preview

После нажатия на кнопку OK в проект будет добавлен модуль с каркасом обработчика. При включении опции Create sample помимо каркаса обработчика будут создан пример готового расширения оболочки, который можно использовать для изучения библиотеки. Рекомендуется перекрывать метод CreatePreviewFromStream или CreatePreviewFromIStream, поскольку это даст возможность Проводнику передавать в расширение не только реальные объекты файловой системы, но и виртуальные объекты, например файл из zip архива.

В обработчике можно перекрывать следующие виртуальные процедуры и функции:

procedure Initialize;

Процедура инициализации обработчика, вызывается один раз при создании экземпляра обработчика. В этом методе можно установить значения свойств AutoBackgroundColor, AutoFont и AutoFontColor, каждое из которые имеет тип Boolean.

Свойство AutoBackgroundColor отвечает за цвет окна, в котором будет отображаться содержимое файла. При значения True цвет будет определяться системой, в противном случае цвет будет определяться разработчиком.

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

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

Все свойства у умолчанию имеют значение True.

procedure Clear;

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

class function GetClassID: TCLSID;

Функция должна возвращать уникальный идентификатор обработчика. Библиотека Shell Ace изначально генерирует уникальный идентификатор при генерации шаблона обработчика, поэтому менять его нет необходимости.

class function GetDescription: UnicodeString;

Функция должна возвращать описание обработчика.

procedure FillProgIDList(AList: TStrings);

В процедуре должно происходить заполнение списка AList ключами реестра, в которые будет прописан обработчик при регистрации расширения. Регистрация происходит в раздел реестра HKEY_CLASSES_ROOT. Например, если будет добавлен ключ .bmp, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\.bmp\ShellEx\{8895B1C6-B41F-4C1C-A562-0D564250836F} и будет соответствовать всем файлам, имеющим расширение bmp, а если будет добавлен ключ SystemFileAssociations\Audio, то расширение будет прописано в ветку HKEY_CLASSES_ROOT\SystemFileAssociations\Audio\ShellEx\{8895B1C6-B41F-4C1C-A562-0D564250836F} и будет соответствовать всем файлам, расширения которых имеют PerceivedType Audio. Дополнительно расширение регистрируется в ключе HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\PreviewHandlers.

При добавлении ключа реестра нужно учитывать, что в Windows определен порядок приоритета обработчиков. И если в системе зарегистрирован обработчик с более высоким приоритетом, то ваш обработчик не будет вызываться.

Порядок приоритета типов объектов, в порядке уменьшения приоритета, может отличаться в различных версиях Windows:

Ключ реестраПримечание
HKCR\ProgIDЕсли для расширения файла определено значение Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.Расширение\UserChoice
HKCR\ProgIDЕсли для расширения файла определено значение ProgID
HKCR\.РасширениеРасширение файла
HKCR\SystemFileAssociations\.РасширениеСистемное расширение файла
HKCR\SystemFileAssociations\PerceivedTypeЕсли для расширения файла определено значение PerceivedType
HKCR\Kind.KindЕсли для расширения файла определено значение Kind
HKCR\UnknownФайл, не имеющий описанного в реестре расширения
HKCR\*Любой файл

В общем случае рекомендуется регистрировать расширение на ProgID расширения файла.

function CreatePreview(AParent: HWND): TdecShellPreviewExtensionForm;

Функция должна создать окно, которое будет встроено в окно Проводника. В этом окне и должно будет отображаться содержимое файла. Функция вызывается из реализации метода DoPreview интерфейса IPreviewHandler.

procedure ClearPage(var APage: TWinControl);

Процедура должна освободить ненужные ресурсы, связанные с отображением файла. Метод вызывается из реализации метода Unload интерфейса IPreviewHandler. В параметре APage передается ранее созданное в функции CreatePage окно.

procedure LoadPreviewFromStream(AStream: TStream; AOpenMode: DWORD; APreview: TdecShellPreviewExtensionForm);

Функция должна на основе потока с данными AStream сформировать отображаемое содержимое, вызывается в реализации метода DoPreview интерфейса IPreviewHandler.

Параметр OpenMode определяет режим работы с потоком. Он может быть равен следующим величинам:

  • STGM_READ – поток может быть использован только для чтения
  • STGM_READWRITE – поток может быть использован как для чтения, так и для записи.

В параметре APreview передается ранее созданное в функции CreatePreview окно.

procedure LoadPreviewFromIStream(AStream: IStream; AOpenMode: DWORD; APreview: TdecShellPreviewExtensionForm);

Метод аналогичен методу LoadPreviewFromStream за исключением того, что вместо потока передается интерфейс IStream. Для создания потока для чтения данных из файла можно воспользоваться следующей функцией:

function CreateStream(AStream: IStream): TStream;

После использования полученного потока его нужно удалить.

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

procedure LoadPreviewFromFile(const AFileName: UnicodeString; AOpenMode: DWORD; APreview: TdecShellPreviewExtensionForm);

Метод аналогичен методу CreatePreviewFromStream за исключением того, что вместо потока передается имя файла. Для создания потока для чтения данных из файла можно воспользоваться следующей функцией:

function CreateStream(const AFileName: UnicodeString; AOpenMode: DWORD = DefaultOpenMode): TStream;

После использования полученного потока его нужно удалить.

Обязательными для реализации в обработчике Preview являются следующие методы:

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