替换“.jpg”缩略图处理程序

Replacing ".jpg" thumbnail handler

我为 windows 10 编写了一个新的缩略图处理程序。当我将它应用到我的自定义“.mic”文件(已重命名为“.jpg”文件)时,该处理程序运行良好。但是,由于某种原因,处理程序根本没有为“.jpg”文件调用。

这些是我在 "DllRegisterServer" 期间添加到注册表的条目:

    // List of registry entries we want to create
    const REGISTRY_ENTRY rgRegistryEntries[] =
    {
        { HKEY_LOCAL_MACHINE,   L"Software\Classes\CLSID\" SZ_CLSID_MYTHUMBHANDLER,                         REG_SZ,   NULL,               SZ_XDRVTHUMBHANDLER },
        { HKEY_LOCAL_MACHINE,   L"Software\Classes\CLSID\" SZ_CLSID_MYTHUMBHANDLER L"\InProcServer32",     REG_SZ,   NULL,               szModuleName },
        { HKEY_LOCAL_MACHINE,   L"Software\Classes\CLSID\" SZ_CLSID_MYTHUMBHANDLER L"\InProcServer32",     REG_SZ,   L"ThreadingModel",  L"Apartment" },
        { HKEY_LOCAL_MACHINE,   L"Software\Classes\.mic\ShellEx\{e357fccd-a995-4576-b01f-234630154e96}" ,  REG_SZ,   NULL,               SZ_CLSID_MYTHUMBHANDLER },
        { HKEY_LOCAL_MACHINE,   L"Software\Classes\.jpg\ShellEx\{e357fccd-a995-4576-b01f-234630154e96}" ,  REG_SZ,   NULL,               SZ_CLSID_MYTHUMBHANDLER },
    };

    hr = S_OK;
    for (int i = 0; i < ARRAYSIZE(rgRegistryEntries) && SUCCEEDED(hr); i++)
    {
        hr = CreateRegKeyAndSetValue(&rgRegistryEntries[i]);
    }

当我尝试使用 "ThumbnailProvider.exe" 实用程序(随 windows SDK 提供)测试我的处理程序时,它运行良好。我 运行 带有“.jpg”文件的实用程序,我的处理程序已成功调用。

为什么资源管理器没有调用我的处理程序?

编辑:
在其他一些 PC 上,它似乎运行良好。我的原始注册码运行良好,正在为 "jpg" 个文件调用我的处理程序。两台 PC 都有 windows 10,实际上它们是使用相同基础映像的虚拟机。

编辑:
我注意到我的处理程序正在为某些“.jpg”文件调用,而在其他文件中则没有。我在这里可能是错的,但我注意到文件之间的主要区别是 "Resolution Unit" 属性。对于工作文件,此 属性 没有值,对于非工作文件,此 属性 的值为“2”。我在所有 PC 上都有相同的行为。 知道这个 属性 如何影响被调用的缩略图处理程序吗?如果不是"Resolution Unit" 属性,是什么不同造成的?

MSDN says 注册新的扩展处理程序对象时需要调用 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)

If you do not call SHChangeNotify, the change might not be recognized until the system is rebooted.

在我的机器上,Microsoft 处理程序在 HKLM\SOFTWARE\Classes\SystemFileAssociations\image 下注册为通用处理程序,我认为该密钥应该具有较低的优先级,但它可能值得研究。正如 Simon 在评论中指出的那样,shell 从 HKCR 读取,这是一个组合视图,其中 HKEY_CURRENT_USER 可以覆盖 HKEY_LOCAL_MACHINE 因此您还应该确保没有为您的特定用户设置任何内容。

进入 semi-documented 领域,我们发现 Explorer 可能会在 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\CachedHKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached 下缓存一些 CLSID 信息,因此如果所有其他方法都失败了,您可以尝试删除这些键(至少HKCU 下的一个应该可以安全删除)。

我想我找到了某些“.jpg”文件未调用缩略图处理程序的原因。某些 jpg 图像似乎在其中嵌入了缩略图。因此,对于这些文件,根本没有调用任何缩略图处理程序。
我使用 exiftool 实用程序读取图像属性,在输出中我看到以下行:
Photoshop Thumbnail : (Binary data 8015 bytes, use -b option to extract) Thumbnail Image : (Binary data 8015 bytes, use -b option to extract)

我使用 exiftool 从文件中删除了缩略图。一旦我这样做了,我的处理程序就成功地调用了这张图片。