调用 IContextMenu 时如何处理重命名操作?

How do you handle rename operations when calling IContextMenu?

我正在用 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 唯一说的是 "Used only for its IUnknown functionality. It has no methods of its own."。

在这种情况下,是否有记录的方法来处理 XP 上的重命名操作?

我真的不想伪造 IDefViewFrame3 界面,但我能想到的唯一其他选择是查看它是否是重命名动词,然后在 TrackPopupMenu 之后自己处理它。

IDefViewFrame3 在 Windows XP 上的 IUnknown 之后看起来像这样:

STDMETHOD(GetWindowLV)(THIS_ HWND*phwnd) PURE;
STDMETHOD(ShowHideListView)(THIS) PURE;
STDMETHOD(OnResizeListView)(THIS) PURE;
STDMETHOD(ReleaseWindowLV)(THIS) PURE;
STDMETHOD(DoRename)(THIS) PURE;

DoRenameInvokeCommand 内的 DefView 调用,但由于它是如此晦涩且没有记录,因此所有第 3 方命名空间扩展都不太可能正确处理它,因此即使您实现了 IDefViewFrame3,您仍然如果 InvokeCommand 失败,必须检查重命名动词。