2

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

但现在我刚刚意识到缩略图处理程序必须注册每个文件类型:缩略图处理程序的

注册是基于标准的文件关联。

(从documentation

我并不想注册每个文件类型,因为我不希望更改不在我的虚拟文件夹中的文件的行为。有没有办法让我的处理程序被调用到我的虚拟文件夹中的所有文件,只有他们?

+0

是否修复了扩展名列表?或者你的文件夹包含不同扩展名的文件,你不知道它们全部吗? – 2014-11-14 18:54:34

+0

@DenisAnisimov,不,这个名单是不固定的。虚拟文件夹中的文件可以有任何扩展名。 – 2014-11-14 19:04:19

+1

外壳名称空间扩展是解决您的问题的正确方案。 – 2014-11-14 19:21:13

回答

2

我看到两种方式让你走。

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

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

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

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

另外:shell命名空间扩展的文档很痛苦,没有多少可用。我编写了自己的shell命名空间扩展,每当我查询到IID的对象时,我就会追踪它并学习更多。我看到我的扩展程序被查询为IID_IThumbnailHandlerFactory,我也看到了IID,例如IID_IExtractIconAIID_IContextMenu,但我没有看到IID_IThumbnailProvider,我也没有看到IID_IExtractImage。这表明你不能将自己的IThumbnailProvider直接附加到为虚拟文件夹创建的对象上,但也可能是因为我错过了在其他位置设置某个标志以便Explorer甚至不试图查询我。

+0

感谢您的回答。简单的解决方案似乎很简单,但如果我这样做,缩略图将在我的虚拟文件夹外的任何地方破碎,不是吗?除非我的处理程序有办法调用默认处理程序... – 2014-11-14 17:35:03

+0

Explorer请求IExtractImage而不是IThumbnailProvider。然后它从IExtractImage实例请求IThumbnailProvider。 – 2014-11-14 18:38:24

+0

@DenisAnisimov,你确定吗?据我所知,IExtractImage是缩略图的旧界面,自Vista以来,它使用IThumbnailProvider而不是 – 2014-11-14 19:05:48

相关问题