DestroyIcon没有毁灭?

时间:2014-08-20 16:56:48

标签: vb.net winapi

我使用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

这是正常行为还是我错过了什么?

1 个答案:

答案 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