IShellItemImageFactory
COM公式ドキュメント
Shell 項目のアイコンまたはサムネイルを返すメソッドを公開します。要求された項目に対して利用可能なサムネイルやアイコンが存在しない場合は、Shell からクラスごとのアイコンが提供されることがあります。
解説(Remarks)
このインターフェイスへのポインターは、通常、次のいずれかの関数を通じて取得します。
- SHCreateItemFromIDList
- SHCreateItemFromParsingName
- SHCreateItemFromRelativeName
- SHCreateItemInKnownFolder
- SHCreateItemWithParent
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IShellItem を表す HBITMAP を取得します。
| size | SIZE | in | 受け取る画像のサイズを指定する構造体です。 |
| flags | SIIGBF | in | 次の値を 1 つ以上指定します。 SIIGBF_RESIZETOFIT (0x00000000)アスペクト比を保ちながら、収まるように必要に応じてビットマップを縮小します。 SIIGBF_BIGGERSIZEOK (0x00000001)返された画像を呼び出し側が自分で拡大したい場合に指定します。たとえば、呼び出し側が 80x80 のアイコンサイズを渡した場合、96x96 のサムネイルが返されることがあります。この動作は、呼び出し側が画像を拡大する必要があると想定している場合のパフォーマンス最適化として利用できます。IShellItemImageFactory の Shell 実装は GDI のストレッチ blit を行う点に注意してください。この仕組みで提供されるよりも高品質な画像の拡大を呼び出し側が望む場合は、このフラグを渡して自分で拡大処理を行う必要があります。 SIIGBF_MEMORYONLY (0x00000002)項目が既にメモリ上にある場合にのみ返します。項目がキャッシュされていてもディスクにはアクセスしません。これはキャッシュ済みのアイコンのみを返し、項目がキャッシュされていないインスタンスごとのアイコンを持つ場合はクラスごとのアイコンにフォールバックすることがある点に注意してください。サムネイルの取得は、キャッシュされていても常にディスクへのアクセスが必要になるため、GetImage を SIIGBF_MEMORYONLY を渡さずに UI スレッドから呼び出すべきではありません。 SIIGBF_ICONONLY (0x00000004)アイコンのみを返し、サムネイルは返しません。 SIIGBF_THUMBNAILONLY (0x00000008)サムネイルのみを返し、アイコンは返しません。すべての項目にサムネイルがあるわけではないため、そのような場合には SIIGBF_THUMBNAILONLY によってメソッドが失敗する点に注意してください。 SIIGBF_INCACHEONLY (0x00000010)ディスクへのアクセスを許可しますが、キャッシュされた項目の取得のみに限定します。利用可能であればキャッシュされたサムネイルを返します。キャッシュされたサムネイルがない場合は、キャッシュされたインスタンスごとのアイコンを返しますが、サムネイルやアイコンの抽出は行いません。 SIIGBF_CROPTOSQUARE (0x00000020)Windows 8 で導入されました。必要に応じて、ビットマップを正方形にトリミングします。 SIIGBF_WIDETHUMBNAILS (0x00000040)Windows 8 で導入されました。ビットマップをアスペクト比 0.7 に拡大してトリミングします。 SIIGBF_ICONBACKGROUND (0x00000080)Windows 8 で導入されました。アイコンを返す場合、関連付けられたアプリに登録された背景色を使用して背景を描画します。 SIIGBF_SCALEUP (0x00000100)Windows 8 で導入されました。必要に応じて、高さと幅が指定されたサイズに収まるようにビットマップを拡大します。 |
| phbm | HBITMAP* | out | このメソッドが正常に返ったときに、取得したビットマップのハンドルを受け取る値へのポインターです。取得したこのリソースが不要になったときに、DeleteObject を通じて解放するのは呼び出し側の責任です。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
アイコンの抽出には時間がかかることがあります。対象のスレッドが応答しなくなるのを避けるため、通常このメソッドを UI スレッドから呼び出すべきではありません。SIIGBF_INCACHEONLY フラグを設定すれば、UI スレッドで IShellItemImageFactory::GetImage を呼び出すことができます。ただし、画像がキャッシュ内に見つからない場合、呼び出し側のアプリケーションは画像を抽出するためのバックグラウンドスレッドを起動できるように準備しておく必要があります。抽出は UI スレッドで行ってはなりません。
このメソッドの使用方法の完全な例については、Using Image Factory のサンプルを参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IShellItemImageFactory "{BCC18B79-BA16-442F-80C4-8A59C30C463B}"
#usecom global IShellItemImageFactory IID_IShellItemImageFactory "{}"
#comfunc global IShellItemImageFactory_GetImage 3 int,int,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。