アイコン

今までSHGetFileInfoを使ってアイコンの情報を取得していたけど、
サムネイルのテスト実装をしている途中で、縮小版はSHGFI_LARGEICON(32*32)より
大きいアイコン(48*48)を使っていることに気づいた。
SHGFI_LARGEICONでは48*48は取得できそうにない。


やはりエクスプローラでも使っているであろうIExtractIconを使うしかないか。
IExtractIconの記述には、SHGetFileInfoは融通が利かずかなり遅い、
IExtractIconは非同期にも対応と書いてあるので、こちらを使うべきだろう。
とりあえず一旦、IExtractIcon変えてみた。
だらだらと書いてあるので遅いけど、後で最適化するつもり。


とりあえず、後で、というのが増えてきたなぁ。
そろそろコードの整理をしたい。

// IExtractIcon取得
IExtractIcon* ei;
HRESULT hr;
UINT reserved;
hr = sf->GetUIObjectOf(NULL, 1, il, IID_IExtractIcon, &reserved, (LPVOID*)&ei);

// Location取得
TCHAR path[MAX_PATH] = _T("");
int index = 0;
UINT flags = 0;
hr = ei->GetIconLocation(GIL_FORSHELL, path, MAX_PATH, &index, &flags);

// アイコン取得
HICON small, large;
hr = ei->Extract(path, index, &large, &small, MAKELONG(96, 16));
ei->Release();

// 描画
DrawIconEx(dc, 0, 0, large, 96, 96, 0, NULL, DI_NORMAL);
DestroyIcon(large);
DestroyIcon(small); // これを忘れていてリークしていた。