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

时间:2016-11-08 22:23:23

标签: windows winapi windows-shell shell-extensions

我正在使用IContextMenu::QueryContextMenu调用CMF_CANRENAME,并且在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之后自己处理它。

1 个答案:

答案 0 :(得分:0)

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调用,但由于它非常模糊且没有文档,因此所有第三方命名空间扩展都不太可能正确处理它,所以即使你实现了IDefViewFrame3,你仍然需要如果InvokeCommand失败,请检查重命名动词。