【问题标题】:System.ArgumentException: Win32 handle that was passed to Icon is not valid or is the wrong typeSystem.ArgumentException:传递给 Icon 的 Win32 句柄无效或类型错误
【发布时间】:2014-10-20 18:22:57
【问题描述】:

我有以下代码来使用 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

【问题讨论】:

  • 该函数不只是得到一个指针。它得到指向数组的指针,意思是指向指针的指针。即使只有一个图标,您也需要一组图标,Icon(1)

标签: vb.net system.drawing shell32.dll


【解决方案1】:

试试这个:

<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

【讨论】:

  • 我尝试了上面建议的代码,它在我的机器上运行良好。但是,我不明白从像 large(0)、small(0) 和 large、small 这样的数组传递第一个值之间有什么区别,因为 ExtractIconEx 被定义为采用 IntPtr 而不是 IntPtrs 的数组?谢谢!
  • @Jyina 你传递的不是large(0)small(0)的值,而是它们的地址。 ExtractIconEx 的声明是 ByRef。你不能传递large, small,因为它需要指针而不是数组。
  • 谢谢。我现在明白了。
  • 谢谢你。转换为 c# 并从 SHGetFileInfo 切换到此代码,因为 SHGetFileInfo 不是并行处理友好的;给出原始问题中所述的错误 - 随机。需要注意的一点是,使用这种方法,你不会得到图标集的注册索引作为应用程序的显示图标,它没有利用 windows 缓存,如果文件中不存在图标,抛出一个你必须捕获的异常(你可以手动设置返回结果的默认图标)
【解决方案2】:

您的声明正确吗? http://www.pinvoke.net/default.aspx/shell32.ExtractIconEx 显示

<DllImport("shell32.dll", CharSet:=CharSet.Auto)> _
 Shared Function ExtractIconEx(ByVal szFileName As String, _
             ByVal nIconIndex As Integer, _
             ByVal phiconLarge() As IntPtr, _
             ByVal phiconSmall() As IntPtr, _
             ByVal nIcons As UInteger) As UInteger
 End Function

【讨论】:

  • 当 nIcons = 1 时没有区别。
  • 图标的数量 = 1 在我的例子中。那么,我的声明是否正确?这对我来说可以。但它不适用于其中一个生产系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-02
相关资源
最近更新 更多