我使用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},我可以在registry中看到这是IDefViewFrame3
的IID,但它似乎是无证的! 另一方面IDefViewFrame被logging,但是MSDN所说的唯一的事情是“仅用于它的IUnknownfunction,它没有自己的方法”。
在这种情况下是否有文档处理XP的重命名操作?
我真的不想伪造一个IDefViewFrame3接口,但我能想到的唯一的其他select是看它是否是重命名的动词,只是在TrackPopupMenu
后自己处理。
在Windows XP的IUnknown之后,IDefViewFrame3看起来像这样:
STDMETHOD(GetWindowLV)(THIS_ HWND*phwnd) PURE; STDMETHOD(ShowHideListView)(THIS) PURE; STDMETHOD(OnResizeListView)(THIS) PURE; STDMETHOD(ReleaseWindowLV)(THIS) PURE; STDMETHOD(DoRename)(THIS) PURE;
而DoRename
是由InvokeCommand
内部的InvokeCommand
调用的,但是由于它是如此晦涩难懂,所以即使你实现了IDefViewFrame3,如果InvokeCommand
失败,你仍然需要检查重命名动作,所以所有第三方名称空间扩展都不可能正确地处理它。