1

Windows 10用の新しいサムネイルハンドラを作成しました。カスタム ".mic"ファイル( ".jpg"ファイルの名前)に適用すると、ハンドラがうまく動作します。しかし何らかの理由で、ハンドラが ".jpg"ファイルのために全く呼び出されていない。".jpg"サムネイルハンドラの置き換え

// 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]); 
    } 

私は(窓SDKに付属)「ThumbnailProvider.exe」ユーティリティを使用して、私のハンドラをテストしようとしたとき、それがうまく機能:

これらは私が「DllRegisterServerは」中にレジストリに追加するエントリです。私はユーティリティを ".jpg"ファイルで実行し、ハンドラが正常に呼び出されました。

なぜハンドラがエクスプローラから呼び出されないのですか?

編集:
他のPCでは、完全に動作しているようです。私のオリジナル登録コードはうまく動作し、ハンドラは "jpg"ファイルのために呼び出されています。両方のPCにはウィンドウ10があり、実際には同じベースイメージを使用しているVMです。

EDIT:
私のハンドラがいくつかの ".jpg"ファイルに対して呼び出されていることに気付きました。私はここで間違っているかもしれませんが、私がファイル間で気づいた大きな違いは、 "解決単位"のプロパティです。作業ファイルの場合、このプロパティの値はありませんでした。作業していないファイルの場合、このプロパティの値は "2"です。私はすべての私のPCで同じ動作をします。 このプロパティが呼び出されるサムネイルハンドラにどのような影響を与えますか?それが「解決単位」プロパティでない場合、その原因となる違いは何ですか?

+0

Software \\ Classes \\のデフォルト値。jpgには通常 "jpegfile"(それ以外のものもあります)が含まれているので、シェルはSoftware \\ Classes \\ jpegfileを探します。また、HKCUが何も上書きしないようにしてください。詳細については、HKCRはHKLM + HKCU Software \\ Classesの統合ビューです。 –

+0

私が言ったように、私は "jpegfile"と ".jpeg"の両方に追加しました。私はそれらのすべてがHKCRの下で自分のハンドラで設定されているのを見る。しかし、私のハンドラはまだ ".jpg"ファイルのために呼び出されていません。 – michael

答えて

0

サムネイルハンドラが「.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を使用しました。私がそれをしたら、私のハンドラーはこのイメージのために正常に呼び出されました。

2

MSDN says新しい拡張ハンドラオブジェクトを登録するときはSHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)に電話する必要があります。

SHChangeNotifyを呼び出さないと、システムが再起動されるまで、変更が に認識されないことがあります。

私のマシンでは、Microsoftハンドラは汎用ハンドラとしてHKLM\SOFTWARE\Classes\SystemFileAssociations\imageの下に登録されていますが、そのキーは優先度が低いと思われますが、調査する価値があると思います。 Simonのコメントに記載されているように、シェルはHKCRから読み込みます。これは、HKEY_CURRENT_USERがHKEY_LOCAL_MACHINEを上書きできる組み合わせビューです。したがって、特定のユーザーに何も設定されていないことを確認する必要があります。私たちは、他のすべては、あなたが(少なくともHKCUの下の1を削除しても安全でなければなりません)これらのキーを削除しようとする可能性が失敗した場合、エクスプローラはとてもHKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\CachedHKCU\Software\Microsoft\Windows\CurrentVersion\Shell Extensions\Cachedの下にいくつかのCLSID情報をキャッシュすることができることがわかりsemi-documented領土に行く

+0

私のハンドラは、Windows SDKの "Recipe"サンプルに基づいているので、私はすでに 'SHChangeNotify'を呼び出しています。あなたが言及した半文書化されたキャッシュを削除しようとしましたが、それでも動作しません。再起動も役に立たなかった。私も@SimonMourierの提案でそれを試しました。 – michael

+0

私も 'HKLM \ SOFTWARE \ Classes \ SystemFileAssociations \ image'を修正しようとしたが、このキーは読み取り専用であり、変更することはできません。 – michael

+0

一部のキーはSystem/Trusted Installerが所有しており、ACLを変更する前にキーの所有権を取得する必要があります。 – Anders