Замена обработчика миниатюр ".jpg"
Я написал новый обработчик миниатюр для 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", и мой обработчик был успешно вызван.
Почему мой обработчик не вызывается проводником?
РЕДАКТИРОВАТЬ:
На некоторых других ПК, кажется, работает отлично. Мой оригинальный регистрационный код работает хорошо, и мой обработчик вызывается для файлов "jpg". Оба ПК имеют Windows 10, и фактически они являются виртуальными машинами, использующими один и тот же базовый образ.
РЕДАКТИРОВАТЬ:
Я заметил, что мой обработчик вызывается для некоторых файлов ".jpg", для других - нет. Я могу ошибаться, но основное отличие, которое я заметил между файлами, - это свойство "Resolution Unit". Для рабочих файлов не было значения для этого свойства, для нерабочих файлов значение для этого свойства - "2". Я получаю одинаковое поведение на всех моих компьютерах. Есть идеи, как это свойство влияет на вызываемый обработчик миниатюр? Если это не свойство "Resolution Unit", в чем может быть разница?
2 ответа
Я думаю, что нашел причину, по которой мой обработчик миниатюр не вызывается в некоторых файлах ".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
чтобы удалить миниатюры из файла. Как только я это сделал, мой обработчик был успешно вызван для этого изображения.
MSDN говорит, что вам нужно позвонить SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
когда вы регистрируете новый объект-обработчик расширения.
Если вы не вызовете SHChangeNotify, изменение может быть не распознано до перезагрузки системы.
На моей машине обработчик Microsoft зарегистрирован как универсальный обработчик в HKLM\SOFTWARE\Classes\SystemFileAssociations\image
и я считаю, что ключ должен иметь более низкий приоритет, но, возможно, его стоит изучить. Как отмечено в комментариях Саймона, оболочка читает из HKCR, и это комбинированное представление, где HKEY_CURRENT_USER может переопределить HKEY_LOCAL_MACHINE, поэтому вы также должны убедиться, что ничего не установлено для вашего конкретного пользователя.
Переходя к полу-документированной территории, мы видим, что Explorer может кэшировать некоторую информацию CLSID в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached
а также HKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Cached
поэтому, если ничего не помогает, вы можете попытаться удалить эти ключи (по крайней мере, тот, который находится под HKCU, должен быть безопасным для удаления).