Поделиться через


Реализация COM-объекта контекстного меню

Расширение контекстного меню — это COM-объект, реализованный как сервер в proc. Расширение контекстного меню должно реализовывать интерфейсы IShellExtInit и IContextMenu. Расширение контекстного меню создается, когда пользователь отображает контекстное меню для объекта класса, для которого зарегистрировано расширение контекстного меню.

Реализация IShellExtInit

После создания экземпляра объекта COM расширения контекстного меню вызывается метод IShellExtInit::Initialize . IShellExtInit::Initialize предоставляет расширение контекстного меню с объектом IDataObject , содержащим данные, относящиеся к объекту каталога, к которому применяется контекстное меню.

IDataObject содержит данные в формате CFSTR_DSOBJECTNAMES. Формат данных CFSTR_DSOBJECTNAMES — это HGLOBAL, содержащий структуру DSOBJECTNAMES. Структура DSOBJECTNAMES содержит данные об объекте каталога, к которому применяется расширение листа свойств.

IDataObject также содержит данные в формате CFSTR_DS_DISPLAY_SPEC_OPTIONS. Формат данных CFSTR_DS_DISPLAY_SPEC_OPTIONS — это HGLOBAL, содержащий структуру DSDISPLAYSPECOPTIONS. DSDISPLAYSPECOPTIONS содержит данные конфигурации для использования расширением.

Если любое значение, отличное от S_OK, возвращается из IShellExtInit::Initialize, расширение контекстного меню не будет использоваться.

Параметры pidlFolder и hkeyProgID метода IShellExtInit::Initialize не используются.

Реализация IContextMenu

После возврата IShellExtInit::Initialize вызывается метод IContextMenu::QueryContextMenu, чтобы получить элемент меню или элементы, которые будет добавлено расширение контекстного меню. Реализация QueryContextMenu довольно проста. Расширение контекстного меню добавляет элементы меню с помощью функции InsertMenuItem или аналогичной функции. Идентификаторы команд меню должны быть больше или равно idCmdFirst и должны быть меньше idCmdLast. QueryContextMenu должен возвращать наибольший числовый идентификатор, добавленный в меню плюс один. Лучший способ назначить идентификаторы команд меню — начать с нуля и работать в последовательности. Если расширение контекстного меню не требует никаких элементов меню, оно не должно просто добавлять элементы в меню и возвращать ноль из QueryContextMenu.

Вызывается IContextMenu::GetCommandString , чтобы получить текстовые данные для элемента меню, например текст справки для элемента меню. Возможно, узел контекстного меню будет использовать строки Юникода, а расширение использует строки ANSI. Из-за этого GCS_HELPTEXTA, GCS_HELPTEXTW, GCS_VERBA и GCS_VERBW случаи должны обрабатываться по отдельности. Реализация этого метода является необязательным.

IContextMenu::InvokeCommand вызывается при выборе одного из элементов меню, установленных расширением контекстного меню. Контекстное меню выполняет или инициирует необходимые действия в ответ на этот метод.