注册文件夹的缩略图处理程序,而不是特定的文件类型

时间:2014-11-14 15:41:52

标签: windows winapi thumbnails shell-extensions callback-file-system

我需要为给定文件夹下的所有文件编写缩略图处理程序。此文件夹是虚拟文件系统的安装点(使用Callback File System),文件实际上并不存在于本地计算机上(它们存储在云中),所以如果我让默认的缩略图处理程序做它的工作,它会尝试从服务器下载整个文件......这显然不是我想要的。

但现在我才意识到必须在每种文件类型中注册缩略图处理程序

  

缩略图处理程序的注册基于标准文件关联。

(来自documentation

我不想为每种文件类型注册它,因为我不想更改不在我的虚拟文件夹中的文件的行为。有没有办法为我的虚拟文件夹中的所有文件调用我的处理程序,只有它们?

1 个答案:

答案 0 :(得分:2)

我认为你有两种方法可以去。

简单的方法:注册您自己的缩略图处理程序,让它适用于所有文件。如果您不支持IInitializeWithStream,但只支持IInitializeWithItemIInitializeWithFile,则可以检查项目/文件是否在您的虚拟文件系统中。如果是这样,您可以返回缩略图,否则返回错误。

此方法的问题是每种文件类型只能注册一个缩略图提供程序。

困难的方法:您可以编写shell命名空间扩展。这些可用于显示虚拟文件夹,可以通过多种方式进行自定义。这是使用cbfs执行已经执行的操作的另一种方法,但它仅限于Explorer。它将添加另一种显示虚拟文件夹的方法。

shell命名空间扩展仅适用于它自己的虚拟文件夹。如果您将虚拟文件夹映射到驱动器号,并且用户在资源管理器中打开该驱动器(而不是shell命名空间扩展的虚拟文件夹),则用户将看到文件的常规资源管理器视图,而不是shell命名空间扩展。

另外:shell命名空间扩展的文档很痛苦,没有多少可用。我编写了自己的shell命名空间扩展,每当我查询IID的对象时,我都会跟踪并学习更多内容。我看到IID_IThumbnailHandlerFactory查询了我的扩展程序,我也看到IID_IExtractIconAIID_IContextMenu等IID,但我没有看到IID_IThumbnailProvider,也没看到IID_IExtractImage }。这表明您不能将自己的IThumbnailProvider直接附加到为虚拟文件夹创建的对象上,但也可能是因为我错过了在其他地方设置了一些标记,以便资源管理器甚至不会尝试查询我