我正在尝试实现shell命名空间扩展,其唯一目的是覆盖特定文件夹中的缩略图处理程序(IExtractImage
)。 我希望其他所有内容与普通文件夹相同,而且我不必重新实现在IShellFolder
的默认实现中完成的所有内容...
那么,是否可以继承此默认实现?如果是这样,怎么样?
使用合成也是一种可接受的解决方案,但是如何获取给定文件夹的类实例呢?
答案 0 :(得分:3)
1)有许多shell扩展可以请求您的文件内容。例如.ico文件图标处理程序。用户也可以安装例如信息提示扩展,它显示来自mp3文件的ID3标签,并且它也请求文件内容。用户可以在详细视图中设置其他列,其中一些列请求文件内容。因此,您必须在shell名称空间扩展中控制许多细节。
2)要创建默认实现,只需调用CoCreateInstance(CLSID_ShellFileSystemFolder,nil,CLSCTX_INPROC_SERVER,IID_IShellFolder,ShellFolder)。
3)有问题。例如:
此类方法也可以导致资源管理器中的AV(从我的实践中)。
所以我相信你的NSE必须实现默认实现所实现的所有已知接口。如果您不想改变方法的行为,只需将参数传递给默认实现。已知的(由我)接口:IBrowserFrameOptions,IOleCommandTarget,的IPersist,IPersistIDList,IPersistFolder,IPersistFolder2,IPersistFolder3,IParentAndItem,的IShellFolder,IShellFolder2,IObjectWithFolderEnumMode,IShellDetails,IShellFolderViewCB,IFolderFilter,INameSpaceTreeControlFolderCapabilities,IShellIcon,IShellIconOverlay,IFolderType,IFolderViewSettings,IExplorerPaneVisibility,IPropertyStoreFactory,IPropertyStore ,IItemNameLimits,IThumbnailFactory。
4)据我所知,你必须控制以下接口的请求:IDataObject,IDropTarget,IExtractIconA(W),IExtractImage,IPropertyStore,IPropertyStoreFactory,IShellFolder(2),IQueryInfo。
5)IShellIcon.GetIconOf必须返回扩展名的默认图标。
6)另外,如果您的文件夹包含子文件夹,请不要忘记在shell请求子文件夹的IShellFolder(2)时返回您的实现。