2014-10-20 4 views
0

У меня есть следующий код для загрузки значка с использованием shell32 dll. Он отлично работает на моей машине. Но одна из систем в производственной среде получила исключение: «System.ArgumentException: дескриптор Win32, который был передан значку, недействителен или является неправильным типом». Любая идея, почему мы получаем эту ошибку? Спасибо!System.ArgumentException: дескриптор 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) –

ответ

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

Я попробовал приведенный выше код, который был предложен, и он отлично работает на моей машине. Тем не менее, я не понимаю, какова будет разница между передачей первого значения из массива, такого как large (0), small (0) и large, small, поскольку ExtractIconEx определен для принятия IntPtr, а не массива IntPtrs? Спасибо! – Jyina

+0

@Jyina Вы не передаете значение 'large (0)' или 'small (0)', а адрес из них. Декларация 'ExtractIconEx' - ** ByRef **. Вы не можете передать «большой, маленький», потому что он ожидает, что указатели не массивы. –

+0

Спасибо. Теперь я понимаю. – Jyina

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. –

+0

Число значков = 1 в моем случае. Итак, есть ли у меня правильная декларация? Он отлично работает для меня. Но это не работает на одной из производственных систем. – Jyina