【问题标题】:Is it possible to inherit the default IShellFolder implementation?是否可以继承默认的 IShellFolder 实现?
【发布时间】:2014-12-03 10:50:28
【问题描述】:

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

那么,是否可以从这个默认实现继承?如果有,怎么做?

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

【问题讨论】:

  • 您需要获取默认的实现接口指针,然后在您的接口实现中转发所有方法调用,除了您要更改行为的方法调用。 To retrieve a pointer to a namespace object's IShellFolder interface, you must...
  • 为您的文件类型注册一个 IThumbnailProvider?
  • @patthoyts,不,它对我不起作用;这就是为什么我必须创建一个命名空间扩展(有关更多详细信息,请参阅this question
  • @RomanR.,是的,这就是我所说的“组合”。但我仍在研究如何为我的文件夹获取默认 IShellFolder 实现的实例。显然相关的类是“Shell File System Folder”(CLSID {F3364BA0-65B9-11CE-A9BA-00AA004AE837})。
  • 你似乎是从 CLSID 开始的,而 MSDN 文章(见上面的链接)建议从 SHGetDesktopFolderSHGetFolderLocation 开始。

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


【解决方案1】:

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 将返回已安装的缩略图处理程序。

这些方法也可以在 Explorer 中导致 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) 时返回您的实现。

【讨论】:

  • 谢谢,很有帮助!
  • 刚开始很难。
  • 好的,基本原理似乎奏效了...我缺少的主要内容是如何创建 ShellFileSystemFolder 的实例(我对 COM 一点也不熟悉)。现在我必须实现所有这些接口;)
  • 你提到的一些接口好像ShellFSFolder没有实现;我应该在其他地方实现它们吗,也许在BindToObjectGetUIObjectOf 返回的类中?
  • 你指的是什么接口?
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多