Расширь контекст Алексей Соколов aka Aggressor Хакер, номер #089, стр. 089-112-1 (pascal@hotmail.ru) Расширение системного контекстного меню Windows Расширение оболочки — удивительно мощный элемент Windows, позволяющий разработчику создавать максимально комфортные и удобные для пользователя приложения. Ты постоянно встречаешься с разными его проявлениями — например, с новыми пунктами контекстного меню: "Проверить" — у антивируса, "Extract" — у WinRAR, новые тулбары в панели задач и т.д. В этом материале я покажу, как легко с помощью Delphi создать свои расширения, добавив пункт "Зашифровать" к контектному меню всех файлов. [COM-объекты] Начнем мы, пожалуй, с того, что любое расширение оболочки реализуется с помощью COM-объекта. COM или Component Object Model (Модель Многокомпонентных Объектов) является основой для технологий ActiveX и OLE. COM определяет API и двоичные стандарты для связи объектов, не зависящих от языка программирования или платформы. COM-объект имеет один или несколько интерфейсов, которые, по сути, представляют собой таблицы функций, связанных с этим объектом. COM определяет стандарты для расположения в памяти функций объектов — они располагаются в виртуальных таблицах. Описание каждой виртуальной таблицы в языке программирования называется интерфейсом. Все COM-интерфейсы неясно выведены из интерфейса IUnknown, который в модуле System определен так: type IUnknown = interface ['{00000000-0000-0000-C000-000000000046}'] function QueryInterface (const IID: TGUID; out Obj): Integer; stdcall; function _AddRef : Integer; stdcall; function _Release: Integer; stdcall; end; Встречаются следующие расширения оболочки: * Обработчики контекстных меню — реализуются двумя интерфейсами: IContextMenu и IShellExtInit. Позволяют добавлять новые пункты в контекстное меню файловых объектов оболочки. * Обработчики перемещений — реализуются интерфейсом ICopyHook. Они позволяют контролировать и отменять копирование, перемещение, удаление и переименование. * Обработчики перетаскивания правой кнопкой мыши — реализуются, как и обработчики контекстных меню, двумя интерфейсами: IContextMenu и IShellExtInit, но они добавляют новый пункт в контекстное меню, которое появляется при перетаскивании объекта в новое место, с помощью правой кнопки мыши. * Обработчики страниц свойств — реализуются интерфейсами IShellPropSheetExt и IShellExtInit. Позволяют добавлять новые страницы в диалоговые окна свойств файлов. * Обработчики пиктограмм — реализуются интерфейсами IExtractIcon и IPersistFile. Этот обработчик позволяет присваивать одному типу файлов различные пиктограммы. * Обработчики цели — реализуются интерфейсами IDropTarget и IPersistFile. Определяют действия оболочки при перетаскивании одного объекта оболочки на другой. Нам же сегодня потребуется только обработчик контекстных меню. Для того чтобы добавить свой пункт в меню, необходимо создать COM-объект. Он будет реализован в виде динамически подключаемой библиотеки, в основе которой лежат два интерфейса: IShellExtinit и IContextMenu. Прежде всего, после вызова контекстного меню, обработчик должен быть инициализирован. Делается это при помощи интерфейса IShellExtinit, у которого только один метод Initialize. Сразу после инициализации происходит вызов TContextMenu.QueryContextMenu (Menu: HMENU; indexMenu, idCmdFirst, idCmdLast, uFlags: UINT): hResult – он добавляет новый пункт в меню. Параметры этого метода означают: |