ファイルごとにアイコンを変える への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 魔界の仮面弁士  (社会人) 投稿日時 2011/9/24 20:10:34
少々複雑ですが、Shell Extension(シェル拡張)という COM 技術を利用することになります。
IconHandler や IExtractIcon といったキーワードで検索してみてください。
http://msdn.microsoft.com/en-us/library/cc144067%28VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/cc144122%28VS.85%29.aspx

上記の手順に従い、IExtractIcon(とIPersistFile)を実装した COM の DLL を作成し、
それをレジストリに登録してください。IPersistFile は最低限 Load さえ実装すれば OK。
Vista 以降では IInitializeWithFile / IInitializeWithStream もあると良いかも知れません。

拡張子に対して、自作アイコンハンドラーのDLL を登録しておくと、OS 側から、
まず IExtractIcon.GetIconLocation メソッドが呼び出されるようになります。
このメソッドの pwFlags に GIL_NOTFILENAME (=&H8) を返すようにすると、さらに
IExtractIcon.Extract メソッドが呼びだされますので、ここでアイコンを返却します。

アイコンの返却には、アイコンハンドル(HICON)が必要です。この部分は Icon クラスの
Handle プロパティを使っても良いですし、LoadIcon API 等で取得してもよいかと思いますが、
確実なのは LoadIcon の方だと思います。

この手の処理は、インターフェイスの処理途中で不具合があると、エクスプローラーを
巻き込んでクラッシュすることもあるので、十分に注意してくださいね。
投稿者 NTS  (社会人) 投稿日時 2011/9/24 16:53:21
例えば、abc という拡張子のファイル 123.abc があるとします。それは関連付けされていて、中身はINIファイルです。

[MAIN]
Version=1.0

ファイルの内容が↑の時に、アイコンの右下に "1.0" と表示させることはできるのでしょうか?
やりかたを教えてください。

簡単に言えば、VisualStudioのプロジェクトファイルみたいな物です。