Замена обработчика миниатюр ".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, должен быть безопасным для удаления).

Другие вопросы по тегам