Vb.net System.ArgumentException:传递给图标的Win32句柄无效或类型错误

Vb.net System.ArgumentException:传递给图标的Win32句柄无效或类型错误,vb.net,system.drawing,shell32.dll,Vb.net,System.drawing,Shell32.dll,我有下面的代码使用Shell32 dll加载图标。它在我的机器上运行得很好。但生产环境中的一个系统出现异常,显示“System.ArgumentException:传递给Icon的Win32句柄无效或类型错误”。 知道我们为什么会出现这个错误吗?谢谢大家! Public Function GetExecutableIcon() As Icon Dim large As IntPtr Dim small As IntPtr ExtractIconEx(Application

我有下面的代码使用Shell32 dll加载图标。它在我的机器上运行得很好。但生产环境中的一个系统出现异常,显示“System.ArgumentException:传递给Icon的Win32句柄无效或类型错误”。 知道我们为什么会出现这个错误吗?谢谢大家!

Public Function GetExecutableIcon() As Icon
    Dim large As IntPtr
    Dim small As IntPtr
    ExtractIconEx(Application.ExecutablePath, 0, large, small, 1)

    Return Icon.FromHandle(small)

End Function

<DllImport("Shell32")> _
Public Shared Function ExtractIconEx(ByVal sFile As String, ByVal iIndex As Integer, 
                 ByRef piLargeVersion As IntPtr, ByRef piSmallVersion As IntPtr, 
                 ByVal amountIcons As Integer) As Integer

End Function
公共函数GetExecutableIcon()作为图标
与IntPtr一样大
像IntPtr一样暗小
ExtractIconEx(Application.ExecutablePath,0,大,小,1)
返回图标。FromHandle(小)
端函数
_
公共共享函数ExtractIconEx(ByVal sFile为字符串,ByVal iIndex为整数,
ByRef piLargeVersion作为IntPtr,ByRef piSmallVersion作为IntPtr,
ByVal amountcons(作为整数)作为整数
端函数

您的声明正确吗?显示

_
共享函数ExtractIconEx(ByVal szFileName作为字符串_
ByVal nIconIndex作为整数_
ByVal phiconLarge()作为IntPtr_
ByVal phiconSmall()作为IntPtr_
拜瓦尔·尼科斯(作为尤因泰格)作为尤因泰格
端函数
试试这个:

<DllImport("Shell32")> _
Public Shared Function ExtractIconEx(ByVal sFile As String, ByVal iIndex As Integer, 
             ByRef piLargeVersion As IntPtr, ByRef piSmallVersion As IntPtr, 
             ByVal amountIcons As Integer) As Integer

Public Function GetExecutableIcon() As Icon
    Dim num As Integer = 10
    Dim large(num - 1) As IntPtr
    Dim small(num - 1) As IntPtr

    ExtractIconEx("C:\Windows\System32\Shell32.dll", 0, large(0), small(0), num)

    Return Icon.FromHandle(small(6)) 'change the index accordingly

End Function
_
公共共享函数ExtractIconEx(ByVal sFile为字符串,ByVal iIndex为整数,
ByRef piLargeVersion作为IntPtr,ByRef piSmallVersion作为IntPtr,
ByVal amountcons(作为整数)作为整数
公共函数GetExecutableIcon()作为图标
Dim num作为整数=10
变暗大(数值-1)为IntPtr
变暗小(num-1)为IntPtr
ExtractIconEx(“C:\Windows\System32\Shell32.dll”,0,大(0),小(0),num)
Return Icon.FromHandle(小(6))'相应地更改索引
端函数

该函数不仅仅获取指针。它获取指向数组的指针,表示指向指针的指针。你需要一个图标数组,即使它只有一个,当nIcons=1时,图标(1)没有区别。在我的例子中,图标的数量=1。那么,我的声明正确吗?这对我来说很好。但是它在其中一个生产系统上不起作用。我尝试了上面建议的代码,它在我的机器上运行良好。但是,我不明白从数组传递第一个值(如大(0)、小(0)和大、小(因为ExtractIconEx被定义为接受IntPtr而不是IntPtr数组)之间有什么区别?谢谢大家!@Jyina传递的不是
large(0)
small(0)
的值,而是它们的地址。
ExtractIconEx
的声明是ByRef。您不能传递大的、小的
,因为它需要指针而不是数组。谢谢。我现在明白了,谢谢你。转换为c#并从
SHGetFileInfo
切换到此代码,因为
SHGetFileInfo
不利于并行处理;给出原始问题中所述的错误-随机。需要注意的一点是,使用此方法,您不会将图标的注册索引设置为应用程序的显示图标,它不会利用windows缓存,如果文件中不存在图标,则会引发一个必须捕获的异常(您将手动为返回结果设置默认图标)
<DllImport("Shell32")> _
Public Shared Function ExtractIconEx(ByVal sFile As String, ByVal iIndex As Integer, 
             ByRef piLargeVersion As IntPtr, ByRef piSmallVersion As IntPtr, 
             ByVal amountIcons As Integer) As Integer

Public Function GetExecutableIcon() As Icon
    Dim num As Integer = 10
    Dim large(num - 1) As IntPtr
    Dim small(num - 1) As IntPtr

    ExtractIconEx("C:\Windows\System32\Shell32.dll", 0, large(0), small(0), num)

    Return Icon.FromHandle(small(6)) 'change the index accordingly

End Function