实现上下文菜单 COM 对象

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

实现 IShellExtInit

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

IDataObject包含 CFSTR _ DSOBJECTNAMES格式的数据。 CFSTR _ DSOBJECTNAMES 数据格式是包含 DSOBJECTNAMES结构的 HGLOBALDSOBJECTNAMES 结构包含有关属性表扩展适用于的目录对象的数据。

IDataObject还包含 CFSTR _ DS _ 显示 _ 规范 _ 选项格式的数据。 CFSTR _ DS _ 显示 _ 规范 _ 选项 数据格式是包含 DSDISPLAYSPECOPTIONS结构的 HGLOBALDSDISPLAYSPECOPTIONS 包含用于扩展的配置数据。

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

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

实现 IContextMenu

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

调用 IContextMenu:: GetCommandString以检索菜单项的文本数据,如要为菜单项显示的帮助文本。 在扩展使用 ANSI 字符串时,上下文菜单宿主可能会使用 Unicode 字符串。 因此,必须单独处理 gc _ HELPTEXTAgc _ HELPTEXTWgc _ VERBAgc _ VERBW 事例。 此方法的实现是可选的。

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