3

SHGetFileInfo特定のファイルタイプのアイコンを取得するために使用しています。MSDN は、について次のように述べていSHFILEINFOます。

hアイコン

    タイプ:ハイコン

    ファイルを表すアイコンへのハンドル。あなたは責任があります
    あなたがもういないときに DestroyIcon でこのハンドルを破棄するため
    それが必要。

HIcon からアイコンを取得するには、 を使用しますIcon.FromHandle。繰り返しますが、MSDN は次のように述べています。

備考

この方法を使用する場合、元のアイコンを破棄する必要があります Win32 API の DestroyIcon メソッドを使用して確実に リソースが解放されること。

SGHFI_ICON説明には次の情報が含まれているため、さらに混乱します。

SHGFI_ICON (0x000000100)

    ファイルを表すアイコンへのハンドルと
    システム イメージ リスト内のアイコンのインデックス。ハンドルは
    psfi で指定された構造体の hIcon メンバにコピーされ、
    インデックスは iIcon メンバーにコピーされます。

この説明から、ハンドルは OS によって保持されているようで、実際に破棄すべきではありません。

私の質問は次のとおりです。もしそうなら、いつアイコンハンドルを処分する必要がありますか?

  • 直後Icon.FromHandle()
  • Icon.FromHandle()から作成したアイコンが不要になった場合 (そのような場合、ハンドルリークを避けるために、アイコンをコピーしてオリジナルを解放し、コピーを返すと思います)
  • 決して (それはどういうわけか自動的に行われますか? SHGetFileInfo の多くの例 - SO であっても - アイコンハンドルを解放するコードは含まれていません)
4

2 に答える 2

3

システムはアイコン ハンドルを保持せず、イメージ リストを保持します。SHGFI_ICONフラグを使用すると、システム イメージ リストに対してSHGetFileInfo呼び出してアイコンを作成します。代わりにフラグを渡してアイコン インデックスだけを取得するImageList_GetIconことで、これを自分で行うことができます。SHGFI_SYSICONINDEX

アイコンは、使い終わったら破棄する必要があります。

于 2013-05-08T11:15:11.140 に答える