X-Finder プログラミング メモ

X-Finderのプログラム関連のメモです。
エラー処理などは省いていますので、実装する際はSucceeded(等を用いて下さい。

■エクスプローラの縮小版キャッシュを利用する

エクスプローラの縮小版キャッシュを読み出す方法です。Windows2000/XPはIShellImageStoreインターフェイス、Windows7/VistaはIThumbnailCacheインターフェイスを使用します。
Windows2000/XPではIThumbnailCacheは取得できませんし、Windows7/VistaではIShellImageStoreが取得できないので両方とも実装しても問題ありません。

Windows2000/XP

1.CoCreateInstance(CLSID_ShellThumbnailDiskCache, NULL, CLSCTX_INPROC, IID_IPersistFolder, ...);
ShellThumbnailDiskCacheをIPersistFolderで取得します。

2.IPerststFolder.Initialize(pidlABSOLUTE);
IPerststFolderをフォルダ(縮小版を開くファイル/フォルダの親フォルダ)のItemIDListで初期化します。

3.IPersistFolder.QueryInterface(IID_IShellImageStore, ...);
IPerststFolder から IShellImageStore を取得します。

4.IShellImageStore.Open(STGM_READ, pdwLock);
IShellImageStore を読み込みモードで開きます。

5.IShellImageStore.IsEntryInStore(pszName, pftTimeStamp);
ファイル名(pszName)で縮小版キャッシュがあるか確かめます。
ここでキャッシュのタイムスタンプ(pftTimeStamp)が実際のファイルのタイムスタンプより新しいか調べます。

6.IShellImageStore.GetEntry(pszName, STGM_READ, phImage);
縮小版キャッシュを phImage に取得します。

7.IShellImageStore.Close(pdwLock);
IShellImageStore を閉じます。

※1-3まではフォルダを開く際に取得しておいて、4-6でファイル/フォルダごとの縮小版を取得します。
そのフォルダに縮小版キャッシュがあるかは、4で開けるかでチェックできます。

Windows7/Vista

1.CoCreateInstance(CLSID_LocalThumbnailCache, NULL, CLSCTX_INPROC, IID_ThumbnailCache, ...);
IThumbnailCacheを取得します。

2.SHCreateShellItem(...);
SHCreateShellItem で IShellItem を取得します。IShellFolder と pidlCHILD からでも pidlPARENT と pidlCHILD からでも取得できます。

3.IThumbnailCache.GetThumbnail(IShellItem, cxyRequestedThumbSize, WTS_INCACHEONLY, ISharedBitmap, NULL, NULL);
cxyRequestedThumbSize のサイズで ISharedBitmap を取得します。
WTS_INCACHEONLYの部分を変えると縮小版がない場合は作成させる事もできます。

4.ISharedBitmap.Detach(...);
SharedBitmapから縮小版キャッシュを取得します。

※1は起動時に1回取得しておいて2-4でファイル/フォルダごと縮小版を取得します。