大人になっても苦手な食べ物、ありますか?

VC++にてエクスプローラもどきを作成しています。

ListViewへファイルアイコンを表示するために、
SHGetFileInfoを使用し、

// 大きいアイコンのハンドル取得
// fnameは拡張子だけの文字列です
SHGetFileInfo( fname, NULL, &shfInfo, sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
licon = shfInfo.hIcon;

上記のようにしてファイルアイコンを取得し、
CImageListへ追加した上で、描画しています。
そして、ダイアログのサイズが変更された際に、
OnSize関数にて、ListView内のアイコンを再度取得し、
再描画しているのですが、
何度もOnSizeで再描画を行っているうちに、
SHGetFileInfoにて取得したshfInfo.hIconが
NULLになってしまいます。
一度、shfInfo.hIconがNULLになると、
何度、SHGetFileInfoを呼んでも、返ってくるhIconは
毎回NULLになってしまい、ListView内に
アイコンが表示されません。

SHGetFileInfo関数を呼ぶ際の制約等があるのでしょうか?

A 回答 (1件)

 こんにちは。


 リソースリークしているのではないでしょうか。
 取り敢えず、使い終わったアイコンのハンドルを削除して見て下さい。
 因みに以下で再現出来しました。

SHFILEINFO shfInfo;
//取り敢えずノートパッド(メモ帳)のアイコンを取って来る
TCHAR szPath[] = _T("C:\\WINNT\\notepad.exe");
for(int i = 0; i < 100000; ++i)
{
SHGetFileInfo( szPath, NULL, &shfInfo, sizeof(SHFILEINFO),SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES );
HICON hicon = shfInfo.hIcon;

//此れを呼べば大丈夫
//::DestroyIcon(hicon);
if(hicon == NULL)
{
//いずれココに来る
}
}
    • good
    • 0
この回答へのお礼

直りました。ありがとうございます。
SHGetFileInfoでも内部でアイコンを作成しているんですね。
とはいえ、CImageListにAddした直後にDestroyIconしても
キチンと表示されているのは不可解な気もしますが。。。
Addしているんだから、描画はAddされたアイコンを使うのでは???
Destroyしちゃったら、何を使って描画させてるんだろう???

お礼日時:2009/03/11 17:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報