しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Thumbnail Provider の実装について調べた

プレビューハンドラは MSDN Magazine で扱われてるからいいけど、サムネイルプロバイダ*1は情報が少ないのでメモ。

嘘書いてるかもしれないのでツッコミ歓迎。

Thumbnail Providers

Thumbnail Provider Guidelines

Building Thumbnail Providers

実装メモ

基本的には IThumbnailProviderIInitializeWithStreamIInitializeWithItemIInitializeWithFile のどれかを実装すればいい。

IThumbnailProvider

IThumbnailProvider は GetThumbnail 1つのメソッドしか持たない。

HRESULT GetThumbnail(
    UINT cx,
    HBITMAP *phbmp,
    WTS_ALPHATYPE *pdwAlpha
);

と引数が定義されていて、それぞれの引数の意味は

  • cx : 要求されてるサムネイルのサイズ。
  • phbmp : 作成したビットマップのハンドル。DIB の 32ビットじゃないとダメ。
  • pdwAlpha : ビットマップハンドルがアルファチャンネルを含んでるかどうか指定する。
    • WTSAT_UNKNOWN : シェルが自動判別する?
    • WTSAT_RGB : アルファチャンネルを含まない。
    • WTSAT_ARGB : アルファチャンネルを含む。

System.Drawing.Bitmap の GetHbitmap で作成したビットマップハンドルをそのまま使えるかどうかは未確認。

IInitializeWithStream, IInitializeWithFile, IInitializeWithItem

IInitializeWithStream と IInitializeWithFile については

MSDN Magazine Issues

を見た方が圧倒的にいいので省略。Initialize メソッドを実装すればいいだけらしい。

IInitializeWithItem は Initialize メソッドの引数の型が IShellItem になっただけ。ちなみに IInitializeWithStream は IStream、IInitializeWithFile は LPCWSTR になっている。

IStream は System.Runtime.InteropService.ComTypes にマネージ型が提供されてるので、IShellItem が引数のこのインターフェースは使いにくそう。

この 3 種類から 1 つのインターフェースを実装しておかないと、どのファイルのサムネイルが必要なのか分からなくなる。

*1:ライブアイコンとも呼ばれるもの