Archive for 7月 16th, 2015

今日のスタート画面

木曜日, 7月 16th, 2015
wp_ss_20150716_0002.jpg

台風がはっきり

Windows Shellex 独自サムネイルの実装(覚書)

木曜日, 7月 16th, 2015

独自ファイル形式をエクスプローラーで見るためのプログラミングの覚書

Microsoftさんから、CppShellExtTuyuumbleHandlerのプロジェクト一式をいただいてきて、VS2013に読み込む、SDKがVS2010なので、VS2013に変換するかと聞かれるのでOKする。

CppShellExtTuyuumbleHandlerの中はほぼテンプレとして使える。

まず、dllmain.cppのCLSIDをオリジナルに変造する。メッセージの部分や拡張子の部分を変造する。オリジナルのdllmain.cppには”.recipe”が2か所あるがこれを、目的の拡張子に書き換える。

あとは、RecipeThumbnailProvider.cppをいじる。ファイル名を変えたほうがすっきりするが面倒くさいのでこのまま使う(^^;…

無題最初に確認するのがGetThumnailのメンバ、デフォルトでは、xmlドキュメントを読んで、その中のイメージを表示するようになっている。(コメントアウトしてある。)ポイントは cx が画像サイズをこれ以下に(縦横とも)、*phbmpにサムネイルの表示するHBITMAPを格納、*pbaAlphaには、ビットマップ形式のRGBかARGBかを指定

あとは、S_OKを関数として返す。(エラーならエラーコードを返す。)

無題2表示するデータ本体は、Initializeでストアする。IStreamの引数*pStreamがやってくるので、メンバの*m_pStreamに保存、している、このm_pStreamがファイルデータの実態であるようだ。

無題3RecipeThumbnailProvider.cppにはヘルパー関数の中に、WICCreate32bppHBITMAPというメンバ関数を用意してくれている。見るとストリームイメージの中にあるイメージブロックをまたストリームで読んできてWICで展開し、HBITMAPに変換している。この結果を*pbaAlphaとともに引数にポインタとして返せば、GetThumnailメンバ関数でコールすれば、サムネイルが表示されるという都合である。

dllmain.cppの部分とReg.cppは主にdllのコールバックとレジストリへの登録とクリーンナップを行っている。

これだけ理解できれば、CppShellExtTuyuumbleHandlerを変造することでエクスプローラー対応のサムネイルハンドラが作成できる。