3

SHGetFileInfo用来获取特定文件类型的图标。MSDN 说SHFILEINFO

图标

    类型:HICON

    代表文件的图标的句柄。你有责任
    当您不再使用 DestroyIcon 销毁此句柄
    需要它。

要从 HIcon 获取图标,我使用Icon.FromHandle. 同样,MSDN 说:

评论

使用此方法时,必须处理掉原来的图标 通过使用 Win32 API 中的 DestroyIcon 方法来确保 资源被释放。

SGHFI_ICON由于描述包含以下信息,因此更加令人困惑:

SHGFI_ICON (0x000000100)

    检索代表文件的图标的句柄和
    系统图像列表中图标的索引。手柄是
    复制到 psfi 指定结构的 hIcon 成员,
    并且索引被复制到 iIcon 成员。

从这个描述来看,这个句柄似乎是由操作系统保存的,我实际上不应该销毁它。

我的问题是:如果,如果是,我应该什么时候处理图标句柄?

  • 紧接着Icon.FromHandle()
  • 当我不再需要从创建的图标时Icon.FromHandle()?(在这种情况下,我想我宁愿复制图标,释放原件并返回副本以避免处理泄漏)
  • 从不(它会以某种方式自动完成?SHGetFileInfo 的许多示例 - 即使在 SO 上 - 也不包括任何释放图标句柄的代码)
4

2 回答 2

3

系统不保留图标句柄,它保留图像列表。当您使用该SHGFI_ICON标志时,通过调用系统图像列表SHGetFileInfo来创建一个图标。ImageList_GetIcon您可以通过传递SHGFI_SYSICONINDEX标志来自己执行此操作,而不是仅检索图标索引。

完成后应销毁该图标。

于 2013-05-08T11:15:11.140 回答
3

不,您确实必须自己调用 DestroyIcon。Icon.FromHandle() 方法对帮助您毫无用处,它仍然需要您调用 DestroyIcon。您必须实现自己的垃圾收集器代码才能知道该图标不再使用,因此可以安全地调用 DestroyIcon。

这是残酷和不寻常的惩罚。Icon 类实际上有一个构造函数,它可以从句柄创建一个 Icon 对象并拥有该句柄,当 Icon 对象被释放或完成时自动调用 DestroyIcon。然而,由于无法想象的原因,他们使它无法访问,这真是太糟糕了。反思救援,你可以绕过这个愚蠢的限制,仍然使用构造函数,在这个答案中找到代码。

于 2013-05-08T11:35:04.370 回答