我正在使用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()
创建的图标时? (在这种情况下,我想我宁愿复制图标,发布原文并返回副本以避免手柄泄漏)答案 0 :(得分:2)
系统不保留图标句柄,它保留图像列表。当您使用SHGFI_ICON
标记时,SHGetFileInfo
会通过针对系统图像列表调用ImageList_GetIcon
来创建图标。您可以通过传递SHGFI_SYSICONINDEX
标志来自己执行此操作,以仅检索图标索引。
完成后,图标应该被销毁。
答案 1 :(得分:2)
不,你真的必须自己打电话给DestroyIcon。 Icon.FromHandle()方法无法帮助您,仍然要求您调用DestroyIcon。您必须实现自己的垃圾收集器代码,以知道该图标不再使用,因此可以安全地对DestroyIcon进行设置。
这是一种残酷和不寻常的惩罚。 Icon类实际上有一个构造函数,可以从句柄创建一个Icon对象,拥有句柄,在处理或完成Icon对象时自动调用DestroyIcon。然而,由于无法解释的原因,它们无法进入。反思救援,你可以绕过这个愚蠢的限制,仍然使用构造函数,找到this answer中的代码。