Расширения оболочки Windows - Всплывающие подсказкиАвтор: Larry J. Rutledge С каждой новой версией Windows, её оболочка (shell) приобретает всё больше и больше различных возможностей. Обычно эти возможности добавляются через расширения оболочки, которые позволяют разработчикам добавлять различные возможности в существующую оболочку Windows. Вот некоторые примеры расширений оболочки: Context Menus (меню, зависящее от объекта, на котором кликнули правой кнопкой мыши), Property Sheet Handlers (страницы в виде закладок, которые появляются в случае выбора пункта контексного меню Properties), Folder Customization, и т.д. На сайте Microsoft доступно большое количество информации о расширениях оболочки, но эта информация мало полезна Delphi аудитории. Итак давайте рассмотрим расширение оболочки под названием "Всплывающие подсказки" (InfoTip), которые появляются в эксплорере, при наведении мышкой на файл.
Расширения оболочки –
Краткий обзор Чтобы быть расширением оболочки, COM сервер должен включать в себя интерфейс, который определяет специфическое поведение для данного расширения, а так же он должен включать в себя интефейс инициализации. Наконец, чтобы быть расширением оболочки, COM сервер должен следовать определённым в системе методам регистрации. Следующая таблица представляет собой список всех существующих на сегодняшний день расширений оболочки, а так же их минимальных версий, учавствующих интерфейсов и их описаний:
Всплывающие подсказки – Введение и обзор Infotip-ы это всплывающие окна подсказки, которые появляются в случае, если курсор мышки находится над любым файлом. Если расширения для файла не было зарегистрировано, то будет высвечиваться окошко с подсказкой по умолчанию, однако Вы можете создать своё собственно расширение для отображения информации об определённом типе файла. Например, Office 2000 инсталирует обработчики для MS Word и MS Excel, которые отображают Имя, Автора и заголовок из свойств документа. Расширения Infotip отличаются от других расширений оболочки по регистрации. Об этом мы поговорим позже, когда перейдём к регистрации нашего расширения Infotip.
Implementing Infotip Extensions IQueryInfo обеспечивает отображение текста во всплывающем окошке и содержит два метода: GetInfoFlags – Получает информационные флаги. На текущий момент это метод не используется, поэтому возвращаем E_NOTIMPL. GetInfoTip – Получает текст Infotip-а. GetInfoTip определена следующим образом: function GetInfoTip(dwFlags: DWORD; var ppwszTip: PWideChar): HResult; stdcall; .dwFlags – в данный момент не используется Важное замечание IPersistFile это то, при помощи чего оболочка обеспечивает расширение информацией о файле, на котором находится курсор. В интерфейсе определены пять методов: .IsDirty – проверяет объект на предмет
изменений, сделанных в текущем файле. Наше
расширение не требует данного метода, поэтому
возвращаем E_NOTIMPL. Load определена следующим образом: function Load(pszFileName: PoleStr; dwMode: LongInt ): HResult; stdcall; .pszFileName – указатель на строку, содержащую
абсолютный путь открываемого файла. Строка
должна завершаться нулём. Чтобы получить имя файла и его путь, мы будем использовать только IPersistFile; фактически мы не используем интерфейс для доступа к файлу, поэтому игнорируем флаги. Стандартная реализация метода Load сохраняет содержимое pszFileName в приватную переменную, которая будет использоваться в IQueryInfo::GetInfoTip для расположения файла.
Проект Delphi: Infotip
Исходник содержит завершённое расширение оболочки Infotip. Infotip будет отображать имя файла, тип проекта (Программа или Библиотека), имя проекта (из файла исходника), и размер файла в байтах. Для начала нам необходимо создать объект автоматизации и назвать его DPRInfoTip. Сперва кликните File | New... (для открытия архива объектов), затем на закладке ActiveX выберите ActiveX Library. Будет сгенерирована пустая библиотека ActiveX и экспортированы необходимые функции, требуемые для данного объектаавтоматизации. Далее, снова кликните File | New... и на закладке ActiveX выберите Automation Object. После этого откроется Automation Object Wizard, в котором необходимо ввести DPRInfoTip как имя CoClass (ниже показано, как выглядит этот диалог). Оставьте остальные опции по умолчанию и нажмите OK, будет сгенерирована основная Type Library и добавлен каркас для интерфейса IDPRInfoTip, который генерируется автоматически.
Как только файлы будут созданы, то следующее, что нам нужно сделать - это добавить поддержку для дополнительных интерфейсов, которые будут поддерживаться: TDPRInfoTip = class(TAutoObject, IDPRInfoTip, IQueryInfo, IPersistFile, IPersist); Обратите внимание: нам необходимо включить также и IPersist, потому что IPersistFile наследуется от IPersist. Прилагаемы исходник можно использовать для всех расширений InfoTip. Единственное, что нужно изменить - это метод GenerateTip. Этот метод определяет текст, который будет отображён InfoTip. В методе Initialization, мы вызываем SHGetMalloc, которая заставляет Windows распределить некоторое количество памяти, а затем возвращает указатель на неё в приватной (private) переменной pMalloc. В деструкторе устанавливаем pMalloc равной Nil. Это позволяет оболочке Windows выделять память при необходимости. IPersistFile::Load
Для всех остальных методов IPersistFile просто возвращаем E_NOTIMPL. IQueryInfo::GetInfoTip
Регистрация расширения
Infotip 1. При помощи regsvr32.exe регистрируется COM DLL (Пуск (Start)..Выполнить(Run)) regsvr32 "C:\...\DPRInfoTip.dll" 2. Добавление ссылки на расширение (.dpr) в ключ реестра HKEY_CLASSES_ROOT. По умолчанию значение для нового ключа должно быть CLSID объекта COM, который содержит расширение оболочки. Данное значение можно получить из файла Type Library, который был сгенерирован Delphi (имя файла оканчивается на "_TLB.pas"). Для нашего примера расширения CLSID назван CLASS_DPRInfoTip и содержит значение "{B20433A8-D083-11D4-993A-00D00912C440}". Самый простой способ внести изменения в реестр - это сделать копию файла .REG, содержащуюся в исходниках проекта. Просто измените CLSID и расширение файла на необходимые значения. Одно важное замечание: если Вы регистрируете расширение оболочки в Windows NT или 2000, то необходимо войти в систему с правами администратора.
|