如何获取IPreviewHandler
特定文件扩展名的外壳?
背景
Windows 允许开发人员为其自定义文件类型创建预览处理程序:
Preview handlers are called when an item is selected to show a lightweight, rich, read-only preview of the file's contents in the view's reading pane. 这是在不启动文件的关联应用程序的情况下完成的。
预览处理程序是托管应用程序。主机包括 Windows Vista 或 Microsoft Outlook 2007 中的 Windows 资源管理器。
我想利用现有的IPreviewHandler
基础设施来获取文件的缩略图。
在流中
问题是我的文件没有放在 shell 命名空间中(即它们没有放在硬盘上)。它们位于内存中,可通过IStream
. 这意味着我不能使用旧版IExtractImage
界面;因为它不支持从Stream加载文件。
幸运的是,这就是现代IPreviewHandler
支持(推荐和更喜欢)从 a 加载数据Stream
,并建议不要从文件加载预览的原因:
此方法优于Initialize,因为它能够使用无法通过 Win32 路径访问的流,例如具有 .zip 文件扩展名的压缩文件的内容。
那我怎么得到它?
没有关于获取与特定扩展相关联的正确方法的文档。IPreviewHandler
但是,如果我按照如何注册的指示IPreviewHandler
,并从另一方阅读合同:
HKEY_CLASSES_ROOT
.xyz
(Default) = xyzfile
HKEY_CLASSES_ROOT
xyzfile
shellex
{8895b1c6-b41f-4c1c-a562-0d564250836f} //IPreviewHandler subkey
(Default) = [clsid of the IPreviewHandler]
鉴于我知道扩展名,我应该能够遵循相同的路线。让我们用一个真实的例子,一个.jpg
文件:
请注意,该文件具有预览。请注意,我包含第二个屏幕截图只是为了强调预览不是来自硬盘驱动器上的文件的想法。
让我们拼写吧!
.jpg
首先是它是一个文件的事实:
HKEY_CLASSES_ROOT
.jpg
(Default) = ACDC_JPG
HKEY_CLASSES_ROOT
ACDC_JPG
ShellEx
{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
ContextMenuHandlers
{8895b1c6-b41f-4c1c-a562-0d564250836f}
等等, previewhandler没有子键。这一定意味着我们无法获得.jpg
文件的缩略图。
减少荒谬
真正的问题
细心的读者会意识到我要问的实际问题是:
如何获得仅包含在流中的图像的预览?
虽然这是一个有用的问题,也是我遇到的真正问题,但如何使用的答案IPreviewHandler
也是一个有用的问题。
因此,请随意回答;或两者!