□ fMask - определяет, заданы ли параметрыdwHotkey/hlcon;
□ lpverb - вызываемая команда;
G lpParameters - параметры (если есть);
• lpDirectory - рабочая папка (поле не обязательно);

□ nShow - флаг состояния окна, который будет передан в функцию

ShowWindow (SW_*);
□ dwHotKey - "горячая"
комбинация клавиш, которая будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре fMask установлен флаг CMIC MASK HOTKEY);
Ohicon - значок, который будет сопоставляться приложению, запускаемому из этого пункта меню (только если в параметре Mask установлен флаг cmic_mask_icon);

OhMoriitor - монитор по умолчанию (поле не обязательно).

Отдельно следует остановиться на описании параметра lpverb. Как уже говорилось, он может представлять из себя как идентификатор пункта меню, так и его текст - строку, заканчивающуюся нулем. Чтобы выяснить это, нужно проверить старшее слово этого 32-разрядного параметра на равенство нулю. В примере ContMenu вызов по тексту не предусмотрен:

if (HiWord(Integer(lpici.lpverb)) о 0) then begin
Exit;
end;

Для создания расширения контекстного меню мы должны породить объект, поддерживающий эти интерфейсы. К сожалению, мастера, предусмотренные в Delphi, не позволяют в автоматизированном режиме создавать объекты, реализующие уже существующие интерфейсы. Поэтому и описание, и реализацию методов придется делать "по старинке", вручную. В примере ContMenu описание объекта таково:

TContextMenu = class (TComObject, IShellExtlnit, IContextMenu) private

FFileName: array [0 . .MAX_PATH] of Char; protected

{ IStellExtlnit }

function IShellExtlnit.Initialize = SEIInitialize;
function SEIInitialize(pidlFolder: PItemlDList;
lpdobj: IDataObject;

hKeyProgID: HKEY) : HResult; stdcall; { IContextMenu }

function QueryContextMenu(Menu: HMENU; indexMenu, idCmdFirst,

idCrndLast,

uFlags: UINT): HResult;
stdcall;
function InvokeCoramand(var lpici: TCMInvokeCommandlnfo): HResult;
stdcall;
function GetCommandString(idCmd, uType: UINT;
pwReserved: PUINT;
pszName: LPSTR;
CchMax: UINT) : HResult;
stdcall;
end;

Вас может насторожить конструкция, описывающая переименование метода initialize интерфейса IShellExtlnit. На самом деле одноименный метод имеется у объекта TComObject, и приведенный синтаксис как раз и предназначен для выхода из подобных ситуаций.

Последняя часть работы - регистрация созданного обработчика. Самое подходящее место для этого - метод updateRegistry фабрики класса. Разработчики примера ContMenu ГЕРСДОМ КШХ TContextMenuFactory, КСЩЫЙ при регистрации СОМ-сервера регистрирует создаваемые фабрикой объекты:

ClassID := GUIDToString(Class_ContextMenu);
CreateRegKey('DelphiProject\shellex1r 1 1 , * ') ;

CreateRegKey('DelphiProject\shellex\ContextMenuHandlers', 11 , 1 1) ; CreateRegKey('DelphiProject\shellex\ContextMenuHandlers\ContMenu*, ' 1,

ClassID) ;

Пример ContMenu иллюстрирует "дельфийский" подход к созданию серверов СОМ через соответствующие объекты из иерархии объектов Delphi. Но в папке SHELLEXT вы найдете еще один пример создания расширения для контекстного меню, сделанный целиком и только с использованием интерфейсов и функций СОМ. Присмотритесь к этому примеру внимательнее, если хотите глубже понимать внутреннюю структуру СОМ-объектов.


⇐ Предыдущая страница| |Следующая страница ⇒

Программирование в Delphi 7



Новости за месяц

  • Ноябрь
    2018
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс