实现上下文菜单 COM 对象
上下文菜单扩展是作为过程内服务器实现的 COM 对象。 上下文菜单扩展必须实现 IShellExtInit 和 IContextMenu 接口。 当用户显示已为其注册上下文菜单扩展的类对象的上下文菜单时,将实例化上下文菜单扩展。
实现 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 方法的 pidlFolder 和 hkeyProgID 参数。
实现 IContextMenu
在 IShellExtInit::Initialize 返回后,调用 IContextMenu::QueryContextMenu 方法以获取上下文菜单扩展将添加的菜单项或项。 QueryContextMenu 实现非常简单。 上下文菜单扩展使用 InsertMenuItem 或类似函数添加其菜单项。 菜单命令标识符必须大于或等于 idCmdFirst ,并且必须小于 idCmdLast。 QueryContextMenu 必须返回添加到菜单加 1 的最大数值标识符。 分配菜单命令标识符的最佳方法是从零开始并按顺序工作。 如果上下文菜单扩展不需要任何菜单项,则它不应将任何项添加到菜单中并从 QueryContextMenu 返回零。
调用 IContextMenu::GetCommandString 以检索菜单项的文本数据,例如要为菜单项显示的帮助文本。 当扩展使用 ANSI 字符串时,上下文菜单主机可能会使用 Unicode 字符串。 因此, 必须单独处理GCS_HELPTEXTA、 GCS_HELPTEXTW、 GCS_VERBA 和 GCS_VERBW 案件。 此方法的实现是可选的。
选择上下文菜单扩展安装的其中一个菜单项时,将调用 IContextMenu::InvokeCommand 。 上下文菜单执行或启动所需的操作以响应此方法。