【发布时间】:2016-11-08 22:23:23
【问题描述】:
我用CMF_CANRENAME 调用IContextMenu::QueryContextMenu,在Windows XP 上调用IContextMenu::InvokeCommand 时处理重命名操作时遇到问题。
我不是命名空间扩展,也没有使用 DefView/IShellView,但我提供了一个实现 IServiceProvider 的站点。
在较新版本的 Windows 上,我被询问是否有实现 IFolderView2 的服务,并且 shell 调用 IFolderView2::DoRename,我可以开始重命名操作。
但在 Windows XP 上,它会查询 SID_DefView 服务,但我找不到任何关于我应该如何实现该服务的信息。
它 (SHELL32!CDefFolderMenu::_ProcessRename) 要求的接口是 {985F64F0-D410-4E02-BE22-DA07F2B5C5E1},我可以在注册表中看到这是 IDefViewFrame3 的 IID,但它似乎是无证!另一方面,IDefViewFrame 已记录在案,但 MSDN 唯一说的是“仅用于其 IUnknown 功能。它没有自己的方法。”。
在这种情况下,是否有记录在案的方式来处理 XP 上的重命名操作?
我真的不想伪造一个 IDefViewFrame3 接口,但我能想到的唯一其他选择是查看它是否是重命名动词,然后在 TrackPopupMenu 之后自己处理它。
【问题讨论】:
-
考虑你是否真的需要支持 XP。
-
如果我没看错你的问题,其他一些代码要求你的代码执行重命名操作,而你在内部使用 shell 上下文菜单来执行实际的重命名。是对的吗?您是在问如何实现
IDefViewFrame3来接收初始重命名请求? -
实际重命名不需要
TrackPopupMenu()。您只需QueryContextMenu()用菜单项填充HMENU,然后找到Rename菜单项并将其ID 传递给InvokeCommand()。或者直接跳过QueryContextMenu()并将硬编码的"rename"动词传递给InvokeCommand()。 -
顺便说一句,MSDN 在撒谎
IDefViewFrame,它实际上定义了3 个方法,如shlobj.h-GetWindowLV()、ReleaseWindowLV()和GetShellFolder()中所见。但是,这些都与执行 shell 操作无关。至于IDefViewFrame3,不仅没有文档,而且在Win32 SDK头文件的任何地方也没有声明,所以它很可能是MS内部使用的私有接口,不希望第三方开发者手动实现。 -
这得到了 IID
{985F64F0-D410-4E02-BE22-DA07F2B5C5E1}的进一步支持,也与IDefViewID相关联,在其文档中具有相同的“仅用于其 IUnknown 功能”注释,并且未声明为不同的任何 Win32 SDK 标头中的接口,它只是IUnknown的#define别名。
标签: windows winapi windows-shell shell-extensions