1

我为Windows 10写了一个新的缩略图处理程序。当我将其应用于自定义的“.mic”文件(将其重命名为“.jpg”文件)时,处理程序运行良好。但是,出于某种原因,处理程序根本不会被称为“.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”实用处理器(设有窗口SDK),它工作得很好。我使用“.jpg”文件运行实用程序,并且我的处理程序已成功调用。

为什么我的处理程序没有被浏览器调用?

编辑:
在其他一些PC上,它似乎工作得很好。我的原始注册码运行良好,我的处理程序被称为“jpg”文件。两台电脑都具有Windows 10,实际上它们是使用相同基本映像的虚拟机。

编辑:
我注意到,我的处理程序正在被称为一些“.jpg”文件,而在其他人不需要。我在这里可能是错的,但我注意到的文件之间的主要区别是“解析单元”属性。对于工作文件,此属性没有值,对于非工作文件,此属性的值为“2”。我的所有电脑上都有相同的行为。 任何想法这个属性如何影响被调用的缩略图处理程序?如果它不是“解析单元”属性,那么导致它的差别是什么?

+0

Software \\ Classes \\的默认值。jpg通常包含“jpegfile”(可以是其他任何内容),所以如果是这种情况,shell将查看Software \\ Classes \\ jpegfile。还要确保HKCU不会覆盖任何东西。有关信息,HKCR是HKLM + HKCU Software \\ Classes的综合视图。 –

+0

我照你说的做了,我把它添加到“jpegfile”和“.jpeg”中。我在HKCR下看到他们都配置了我的处理程序。但是,我的处理程序仍然没有被称为“.jpg”文件。 – michael

回答

0

我想我找到了为什么我的缩略图处理程序没有被某些“.jpg”文件调用的原因。看起来有些jpg图像里面嵌入了缩略图。所以对于这些文件,根本不会调用缩略图处理程序。
我用exiftool实用程序来读取图像属性,在输出I看到下面的行:
Photoshop Thumbnail : (Binary data 8015 bytes, use -b option to extract) Thumbnail Image : (Binary data 8015 bytes, use -b option to extract)

我用exiftool从文件中删除缩略图。一旦我做到了,我的处理程序就被成功地调用了这个图像。

2

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

如果您未调用SHChangeNotify,则可能无法识别更改 ,直到系统重新启动。

在我的机器的微软处理程序注册为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下一个应该是安全删除)。

+0

我的处理程序基于windows SDK中的“Recipe”示例,所以我已经调用了'SHChangeNotify'。我尝试删除您提到的半文档缓存,但仍然无效。重新启动也没有帮助。我也用@SimonMourier的建议尝试过。 – michael

+0

我也想尝试修改'HKLM \ SOFTWARE \ Classes \ SystemFileAssociations \ image',但这个键是只读的,不能修改。 – michael

+0

某些密钥由系统/受信任的安装程序拥有,您需要先获得密钥的所有权,然后才能更改ACL。 – Anders