SHGetFileInfoとDestroyIcon
なんか涙ぐましいことしてるなぁ….NETのListViewにSendMessage か…。
いや、ちょっと昔を思い出して。
VB6でね。エクスプローラもどきをつくろうとしたんですよ。
デスクトップをルートとする仮想フォルダツリーもちゃんと表示したりして。
SHGetFileInfoで、システムイメージリストのハンドルを取得するわけですよ。
でも、VBのListViewに設定できるのは、あくまで「ImageListコントロール」だったんですね。
しかも、その中身はIPictureDispじゃないといけないと来たもんだから、システムイメージリストの中身をOleCreatePictureIndirectで変換して、それを1個ずつImageListに追加してたんですね。
既にあるものをわざわざ複製するなんて馬鹿らしいと思いながら。
Windows SDKなら、SendMessageで一発なのにと。変換なんかしなくても、既にあるものがそのまま使えるのにと。
VB6を捨ててC+Platform SDKの世界に飛び込んだきっかけはそれでした。
.NETになっても、ImageList.Handleプロパティはあるくせに、ImageList.FromHandleメソッドは無いんだね…
以下は完全に余談。
シャノンというハンドルは、恐れ多くも情報理論の開祖、Claude Elwood Shannon大先生にあやかってつけたものです。
当時、データ圧縮にハマってまして、その端緒を開いたのがシャノンのエントロピー符号であったことに始まります。
ちなみにあの頃は、「全てのアーカイバを集める」ということもやろうとしてました。後に、ほとんどのアーカイバは似たり寄ったりのアルゴリズムでできていること、アルゴリズムをちょこっと変えれば違うアーカイバができることを知って、止めてしまいましたけど。
で、最初はLhasaのようなダイアログベースアーカイバを作ろうとしたんですが、次第に、書庫ファイルをフォルダとして扱えるようなエクスプローラライクなものへと構想が変わっていって、上記のような事態になったという次第。
その後、エクスプローラライクなものを自作するより、エクスプローラそのものを利用した方がいいだろうということに気付き、シェル拡張を志し、その基礎たるCOMに手を染めるという流れで、脈々と今に続いていたりするのでした。
# その割に、具体的な成果物はまだ何一つないんだけどナー('~`;)