2013年8月27日火曜日

Windows 8 で 変更したはずのアイコンが変わらない


Windows 8 Pro 64bit 上における話。

Windows 8 Pro でアプリケーションのリソース内のアイコンを変更しても、アイコンの表示が更新されない場合の対策。
(文末の追記に注意事項があります。ご確認下さい)


とりあえずアイコンが完成したのでアイコン変更。
ところが、コンパイルしてもアイコンが変わらない
(各色深度毎に全変更、リソースの更新もれ等はなく、出力されたバイナリも検証済み)

何故なんだ。

という事になってる人はけっこういるはず・・・。

よくある話。

こういった場合、画面の解像度で表示色数の変更をすると XP ~ 7 では、確実に更新されてきたのだけど。
Windows 8 は、解像度の変更に表示色数を設定する項目が見当たらないので、この方法はとれない・・・。

%userprofile%\AppData\Local にある IconCache.db を削除して再起動しても変化なし。

消した後、空の IconCache.db を作成してから再起動するとよいなどの投稿を見かけたので試すものの状況変わらず。

何はともあれ c:\ などから
dir /s iconcache* で検索すると

%userprofile%\AppData\Local\Microsoft\Windows\Explorer

以下に

iconcache_16.db
iconcache_32.db
iconcache_48.db
iconcache_96.db
iconcache_256.db
iconcache_1024.db
iconcache_idx.db
iconcache_exif.db
その他 iconcache_*.db

が見つかります。

それを >clear_iconcache.txt に出力し、以下のように加工してバッチファイルを作ります。
以下は例。

@echo エクスプローラーを終了してからキャッシュを消します
pause
taskkill /f /im explorer.exe
c:
cd \Users\(ユーザー名)\AppData\Local\Microsoft\Windows\Explorer
del iconcache_1024.db
del iconcache_16.db
del iconcache_256.db
del iconcache_32.db
del iconcache_48.db
del iconcache_96.db
del iconcache_exif.db
del iconcache_idx.db
del iconcache_sr.db
del iconcache_wide.db
cd\
start explorer.exe
@echo 終了
pause

補足
特に足すものは思いつきませんが。
不安な場合は mkdir bak して bak に move にしたほうが良いでしょう。
コピペの場合は、ユーザー名は自分のに変更してください。

アクセス拒否
アクセス拒否で削除が失敗する場合があります。
taskkill の後に pause とか、待ちコマンドの類で数秒まったほうが良いかもしれない。
とはいえ、解放のタイミングなど知る由もなく、直後でも何回か実行すれば消せる。

ファイル名
clear_iconcache.txt は .bat にしてから実行してください。
編集中は .txt のままがいいかと。誤って実行しないためにも。

ご利用は自己責任でお願いします。

~idx.db というファイルがあるのだけど、インデックスの類かもしれないので、これらの iconcache*.db は上記の例のようにまとめて消したほうが良いように思う。
調査したわけではないので何のファイルかはわかりません。
該当するサイズのアイコンキャッシュのみを消すか全部消すかは、その辺の判断も各自でお願いします。

ということで。

これらを消して explorer を再起動すればOKでした。

system32のconfig\systemprofile 以下にも同名のファイルがありますが、そちらは消さないほうが良いように思います。

また、ワイルドカード指定による削除はパラメータ仕様、文字コード、8.3等々の理由により、かなりリスキーですのでご注意願います。

さらに一応書いておくと、explorerの再起動にうまく追従できずにクラッシュしたり、それが引き金となり不具合が発生するアプリケーションもあると思います。
その辺の把握と対策(事前に終了させるなど)も各自で願います。

普通に削除や移動したい場合(explorerのプロセスの終了やファイルハンドルのクローズをせずにこれらのファイルを消したり移動する場合)は、 explorer によってロックされているので、そのままではできません。

いったん現在のユーザーをサインアウトすることでエクスプローラーを通常の手順で終了させ、管理者権限のある別のユーザーでサインイン(ログイン)して、その該当ユーザーの %userprofile%フォルダの Local\Microsoft\Windows\Explorer にアクセスして、目的のファイルを消す等が考えられます。

管理者権限のあるユーザー1つだけで運用している場合には、別の管理者権限のユーザーを作成すればOKですが、好ましくはないでしょうからその辺の判断も各自でお願いします。

他には、セーフモードとコマンドプロンプト。
ちなみにセーフモードは
shutdown /r /o /t 0 で起動時のオプションメニューがでるのでそこから選択して再起動すれば入れたはず。
リカバリーとかもここからできてしまうようなので、慣れないメニューだし、かえって危険なような・・・。

ちなみにディスクのクリーンナップでも消えてくれる場合もあるのかもしれないように思うものの、条件がそろわないと消えてはくれないか、そもそも消えてはくれないのではないかと・・・。


以下メモ。

・この問題に限っては、Local\IconCache.db は関係なさそう。
 Local\Microsoft\Windows\Explorer\iconcache_*.dbの削除とexplorerの再起動のみでアイコンは更新されます。

・他のフォルダにコピーしたり、ファイル名を変更すれば表示される。

・一度以上ショートカットを作成したことがあるフォルダ、コピー・移動した事があるフォルダには、何度ショートカットを作成しなおそうと、どこにファイルをコピー・移動しようが変わらない。

・最新情報に更新は有効ではない。

・コピーして ファイル名(2) のようにファイル名が変われば新しいアイコンになります。
  オリジナルを消して、ファイル名(2)をオリジナルのファイル名に戻すと、古いアイコンに戻ります。
  まあ当たり前ですが。メモなので・・・。

・リソースの構造は関係なかった。
  16,32,48,256 ^2 の 8,16,24,32bitの各色深度でリソースを作成してコンパイル。
  32^2 ,32bit のアイコンのみでコンパイル。
  いずれの場合も古いままで反映されない。
  ただし、逆の場合で未知のアイコンについては反映されます。
  32^2, 32bit のアイコンしかないアプリケーション→ 多彩な解像度に対応した場合、 32^2, 32bit 以外のアイコンは新しいものが表示される。

・タスクバーのピン留は、ピン留を解除してやりなおせば更新される。

・Local\のIconCache.db を消して、Local\Microsoft\Windows\Explorer\iconcache_*.db も消して再起動すると、消えたまま。 次回explorer再起動時に復活します。

以上。後半ただのメモなのでけっこう適当です。


この情報は無保証です。各自の責任でご利用願います。
後で編集したり削除する場合があります。


追記
この作業でフォトのライブタイルなどが更新されなくなったり、フォトを開いてもピクチャライブラリ内のファイルが表示されなくなる可能性があります。
私の環境で長期間フォトのライブタイルをオフにし使用していなかったため関連性の確認はできておりません。
他に、thumbcache_idx.db というファイルが同ディレクトリに存在します。今回の作業ではこれらは操作していませんので、影響があったとは考えにくいものの、ある時点からフォトが機能しなくなっていたため、情報として残しておきます。
また、私の環境では Windows Search サービスが停止しており、それが影響していたようです。
フォトの情報更新が必要になった時点で Windows Search が機能できる状態であれば、滞りなく更新されるものと予想されます。

ストアアプリの「フォト」でピクチャライブラリの内容が行方不明になったり更新されなくなった場合、Windows Search サービスの状態を確認してみるとよいようです。

別の記事で対策を書かせてもらいました。
http://eisen-japan.blogspot.jp/2013/08/windows-8_30.html

以上。


0 件のコメント:

コメントを投稿