投稿者 魔界の仮面弁士  (社会人) 投稿日時 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 の方だと思います。

この手の処理は、インターフェイスの処理途中で不具合があると、エクスプローラーを
巻き込んでクラッシュすることもあるので、十分に注意してくださいね。