SHGetFileInfo之后的DestroyIcon?

时间:2013-05-08 10:08:10

标签: shell winapi memory-leaks icons handle

我正在使用SHGetFileInfo来获取特定文件类型的图标。 MSDN说明了SHFILEINFO

hIcon

    Type: HICON

    A handle to the icon that represents the file. You are responsible 
    for destroying this handle with DestroyIcon when you no longer 
    need it.

要从HIcon获取图标,我使用Icon.FromHandle。再一次,MSDN说:

Remarks

When using this method, you must dispose of the original icon by using the DestroyIcon method in the Win32 API to ensure that the resources are released.

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

SHGFI_ICON (0x000000100)

    Retrieve the handle to the icon that represents the file and the 
    index of the icon within the system image list. The handle is 
    copied to the hIcon member of the structure specified by psfi, 
    and the index is copied to the iIcon member.

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

我的问题是:如果,如果是的话,何时应该处理图标句柄?

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

2 个答案:

答案 0 :(得分:2)

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

完成后,图标应该被销毁。

答案 1 :(得分:2)

不,你真的必须自己打电话给DestroyIcon。 Icon.FromHandle()方法无法帮助您,仍然要求您调用DestroyIcon。您必须实现自己的垃圾收集器代码,以知道该图标不再使用,因此可以安全地对DestroyIcon进行设置。

这是一种残酷和不寻常的惩罚。 Icon类实际上有一个构造函数,可以从句柄创建一个Icon对象,拥有句柄,在处理或完成Icon对象时自动调用DestroyIcon。然而,由于无法解释的原因,它们无法进入。反思救援,你可以绕过这个愚蠢的限制,仍然使用构造函数,找到this answer中的代码。

相关问题