我用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唯一说的是"仅用于其未知功能"。它没有自己的方法。"
在这种情况下,是否有文档化的方法来处理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;
和DoRename
是由DefView在InvokeCommand
内调用的,但由于它是如此模糊和未记录,所以不太可能所有第三方命名空间扩展正确处理它,所以即使你实现IDefViewFrame3,你仍然要检查重命名动词,如果InvokeCommand
失败。