实现上下文菜单 COM 对象

上下文菜单扩展是作为过程内服务器实现的 COM 对象。 上下文菜单扩展必须实现 IShellExtInitIContextMenu 接口。 当用户显示已为其注册上下文菜单扩展的类对象的上下文菜单时,将实例化上下文菜单扩展。

实现 IShellExtInit

实例化上下文菜单扩展 COM 对象后, 将调用 IShellExtInit::Initialize 方法。 IShellExtInit::Initialize 使用 IDataObject 对象提供上下文菜单扩展,该对象包含与上下文菜单应用于的目录对象相关的数据。

IDataObject 包含CFSTR_DSOBJECTNAMES格式的数据 CFSTR_DSOBJECTNAMES数据格式是包含 DSOBJECTNAMES 结构的 HGLOBAL DSOBJECTNAMES 结构包含属性表扩展应用于的目录对象的相关数据。

IDataObject 还包含CFSTR_DS_DISPLAY_SPEC_OPTIONS格式的数据 CFSTR_DS_DISPLAY_SPEC_OPTIONS数据格式是包含 DSDISPLAYSPECOPTIONS 结构的 HGLOBAL DSDISPLAYSPECOPTIONS 包含供扩展使用的配置数据。

如果从 IShellExtInit::Initialize 返回除 S_OK 以外的任何值,则不会使用上下文菜单扩展。

不使用 IShellExtInit::Initialize 方法的 pidlFolderhkeyProgID 参数。

实现 IContextMenu

在 IShellExtInit::Initialize 返回后调用 IContextMenu::QueryContextMenu 方法以获取上下文菜单扩展将添加的菜单项或项。 QueryContextMenu 实现非常简单。 上下文菜单扩展使用 InsertMenuItem 或类似函数添加其菜单项。 菜单命令标识符必须大于或等于 idCmdFirst ,并且必须小于 idCmdLastQueryContextMenu 必须返回添加到菜单加 1 的最大数值标识符。 分配菜单命令标识符的最佳方法是从零开始并按顺序工作。 如果上下文菜单扩展不需要任何菜单项,则它不应将任何项添加到菜单中并从 QueryContextMenu 返回零

调用 IContextMenu::GetCommandString 以检索菜单项的文本数据,例如要为菜单项显示的帮助文本。 当扩展使用 ANSI 字符串时,上下文菜单主机可能会使用 Unicode 字符串。 因此, 必须单独处理GCS_HELPTEXTAGCS_HELPTEXTWGCS_VERBAGCS_VERBW 案件。 此方法的实现是可选的。

选择上下文菜单扩展安装的其中一个菜单项时,将调用 IContextMenu::InvokeCommand 。 上下文菜单执行或启动所需的操作以响应此方法。