我使用SHGetFileInfo API返回与某些扩展相关联的图标,如下所示:
If SHGetFileInfo("n.exe", FileAttributeNormal, _shFIleInfo, Marshal.SizeOf(_shFIleInfo), ShgfiUseFileAttributes Or ShgfiIcon Or ShgfiSmallIcon) <> IntPtr.Zero Then
Debug.WriteLine("Success")
End If
其中_shFileInfo是结构:
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Public Structure ShFileInfo
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As UInteger
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
Public szDisplayName As String
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
Public szTypeName As String
End Structure
使用这些标志:
Private Const ShgfiUseFileAttributes As UInteger = &H10
Private Const ShgfiSmallIcon As UInteger = &H1
Private Const ShgfiIcon As UInteger = &H100
我可以从_shFIleInfo.hIcon获取这个我想要的图标句柄
我注意到的是,在我处理完之后,我仍然可以访问Handle,因为它不会在下面的行中抛出错误。
Public Sub DisposeShFileInfo()
If DestroyIcon(_shFIleInfo.hIcon) Then
Debug.WriteLine("Disposed")
Debug.Writeline(_shFIleInfo.hIcon)
End If
End Sub
这是正常行为还是我错过了什么?
答案 0 :(得分:1)
HICON
只不过是一个不透明的句柄。在C#中,这用IntPtr
表示。您可以调用DestroyIcon
来完成句柄后面的对象。当您打印句柄的值时,您仍然会得到一个值。但是,如果您尝试将此现在销毁的句柄值传递给另一个API函数,则该函数调用将失败。
在C语言中,这类似于以下内容:
int *p = malloc(sizeof *p);
free(p);
// p is not null, but is now a stale pointer