是否可以继承默认的IShellFolder实现?

时间:2014-12-03 10:50:29

标签: c++ windows shell winapi shell-extensions

我正在尝试实现shell命名空间扩展,其唯一目的是覆盖特定文件夹中的缩略图处理程序(IExtractImage)。 我希望其他所有内容与普通文件夹相同,而且我不必重新实现在IShellFolder的默认实现中完成的所有内容...

那么,是否可以继承此默认实现?如果是这样,怎么样?

使用合成也是一种可接受的解决方案,但是如何获取给定文件夹的类实例呢?

1 个答案:

答案 0 :(得分:3)

1)有许多shell扩展可以请求您的文件内容。例如.ico文件图标处理程序。用户也可以安装例如信息提示扩展,它显示来自mp3文件的ID3标签,并且它也请求文件内容。用户可以在详细视图中设置其他列,其中一些列请求文件内容。因此,您必须在shell名称空间扩展中控制许多细节。

2)要创建默认实现,只需调用CoCreateInstance(CLSID_ShellFileSystemFolder,nil,CLSCTX_INPROC_SERVER,IID_IShellFolder,ShellFolder)。

3)有问题。例如:

  1. Shell从您的NSE查询未知的IShellFolder3。
  2. 您的NSE未实现IShellFolder3,NSE从默认实现中查询IShellFolder3并返回结果。
  3. Shell使用IID_IExtractImage调用IShellFolder3.GetUIObject,默认IShellFolder3将返回已安装的缩略图处理程序。
  4. 此类方法也可以导致资源管理器中的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)时返回您的实现。