2014-10-20 142 views
0

我有下面的代码来使用Shell32 dll加载图标。它在我的机器上正常工作。但是生产环境中的一个系统出现异常,说“传递给Icon的System.ArgumentException:Win32句柄无效或类型错误”。 任何想法,为什么我们得到这个错误?谢谢!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 
+0

的功能并不仅仅获得一个指针。它获取*一个指向数组的指针*,意味着指向指针*的指针。即使只有一个图标,也需要一组图标,图标(1) – 2014-10-20 18:31:07

回答

2

试试这个:

<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 
+0

我试过上面提到的代码,它在我的机器上工作正常。然而,我不明白传递数组中的第一个值(如大(0),小(0)和大,小)之间的区别是什么,因为ExtractIconEx被定义为采用IntPtr而不是IntPtrs数组?谢谢! – Jyina 2014-10-20 19:19:07

+0

@Jyina你没有传递“large(0)”或“small(0)”的值,而是它们的地址。 'ExtractIconEx'的声明是** ByRef **。你不能传递'large,small',因为它期望指针而不是数组。 – 2014-10-20 19:26:24

+0

谢谢。我现在知道了。 – Jyina 2014-10-20 20:59:53

1

您的声明是否正确? 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 
+1

当nIcons = 1时不会有任何区别。 – 2014-10-20 18:37:50

+0

在我的情况下,图标数= 1。那么,我有正确的声明吗?这对我来说可以。但它不适用于其中一个生产系统。 – Jyina 2014-10-20 18:56:41