我需要为给定文件夹下的所有文件编写缩略图处理程序。 这个文件夹是一个虚拟文件系统(使用callback文件系统 )的挂载点,并且这些文件实际上并不存在于本地机器上(它们存储在云中),所以如果我让默认的缩略图处理程序执行它工作,它会尝试从服务器上下载整个文件…这显然不是我想要的。
但是现在我只是意识到,一个缩略图处理程序必须注册每个文件types :
缩略图处理程序的注册基于标准文件关联。
(来自文档 )
我不想为每个文件types注册它,因为我不想更改不在我的虚拟文件夹中的文件的行为。 有没有办法让我的处理程序被称为我的虚拟文件夹中的所有文件,只有他们?
我看到有两种方法可以去。
简单的方法:注册您自己的缩略图处理程序,让它处理所有文件。 如果您不支持IInitializeWithStream
但仅支持IInitializeWithStream
或IInitializeWithFile
,则可以检查项目/文件是否位于虚拟文件系统中。 如果是这样,你可以返回一个缩略图,否则返回一个错误。
这种方法的问题是每个文件类型只能注册一个缩略图提供者。
困难的方法:你可以编写一个shell命名空间扩展。 这些可以用来显示虚拟文件夹,可以通过多种方式进行自定义。 这是另一种方法来做你已经使用cbfs,但只限于资源管理器。 它会添加另一种方式来显示您的虚拟文件夹。
shell命名空间扩展只能用于它自己的虚拟文件夹。 如果将虚拟文件夹映射到驱动器号,并且用户在资源管理器(而不是shell命名空间扩展的虚拟文件夹)中打开该驱动器,则用户将看到文件的常规资源管理器视图,而不是您的shell命名空间扩展。
另外:shell命名空间扩展的文档是一个痛苦,没有太多的可用。 我写了自己的shell命名空间扩展,并且每当我查询IID的对象时,我都会跟踪并学习更多。 我看到我的扩展名为IID_IThumbnailHandlerFactory
, IID_IExtractIconA
或IID_IContextMenu
,但是我没有看到IID_IThumbnailProvider
,也没有看到IID_IExtractImage
。 这表明你不能将自己的IThumbnailProvider
直接附加到为虚拟文件夹创建的对象上,但也可能是因为我错过了在别的地方设置一些标志,所以Explorer甚至不会试图查询我。