我正在使用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上-也不包含任何释放图标句柄的代码)
  • 最佳答案

    系统不保留图标句柄,而是保留图像列表。使用SHGFI_ICON标志时,SHGetFileInfo通过针对系统映像列表调用ImageList_GetIcon来创建图标。您可以通过传递SHGFI_SYSICONINDEX标志来自己完成此操作,而只检索图标索引。

    完成使用后,该图标应销毁。

    10-03 01:15