我试图实现一个shell命名空间扩展名,唯一的目的是覆盖特定文件夹中的缩略图处理程序( IExtractImage
)。 我希望其他所有东西都和正常的文件夹一样 ,我宁愿不必重新实现在IShellFolder
的默认实现中完成的所有事情。
那么,是否有可能从这个默认的实现inheritance? 如果是这样,怎么样?
使用组合也将是一个可以接受的解决scheme,但我怎样才能得到一个给定的文件夹类的实例?
1)有很多可以请求你的文件内容的外壳扩展。 例如.ico文件图标处理程序。 另外用户可以安装例如信息提示扩展名,它显示来自mp3文件的ID3标签,并且它也请求文件内容。 用户可以在详细视图中设置其他列,其中一些列请求文件内容。 所以你必须控制你的shell名称空间扩展中的很多细节。
2)创建一个默认实现,只需调用CoCreateInstance(CLSID_ShellFileSystemFolder,nil,CLSCTX_INPROC_SERVER,IID_IShellFolder,ShellFolder)。
3)有一个问题。 例如:
此外,这样的方法可能会导致资源管理器内部(从我的做法)。
所以我相信你的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)此外,如果您的文件夹包含子文件夹不要忘记返回您的实现时,外壳请求IShellFolder(2)的子文件夹。