□ 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



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

  • Июль
    2020
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31