Поскольку мне нужно извлечь значок из файла, но не первый значок, я не могу использовать функцию извлечения значка vb.net. Функция WIN32API, которая должна это делать, ожидает указатель на целочисленный массив.vb.net win32api указатель на целочисленный параметр массива
Как я могу предоставить этот тип в качестве параметра?
Declare Function ExtractIconEx Lib "shell32.dll" Alias "ExtractIconExA" _
(ByVal lpszFile As String, _
ByVal nIconIndex As Integer, _
ByRef phiconLarge As Integer, _
ByRef phiconSmall As Integer, _
ByVal nIcons As Long) As Integer
Dim icons As integer()
ExtractIconEx("%systemroot%/shell32.dll", 15, icons, 0, 5)
Я взял гусак на System.Reflection.Pointer
класса?/?, имен, но документация немногочисленны и менее разумно.
IntPtr
не обеспечивает поддержку массивов afaikt
Ok ОГО Ганс мне удалось исправить подпись:
<Runtime.InteropServices.DllImport("shell32.dll", _
CharSet:=Runtime.InteropServicesCharSet.Auto)> _
Shared Function ExtractIconEx(ByVal szFileName As String, _
ByVal nIconIndex As Integer, _
ByRef phiconLarge() As IntPtr, _
ByRef phiconSmall() As IntPtr, _
ByVal nIcons As UInteger) As UInteger
End Function
...
Dim icons(8) As IntPtr, smicons(8) As IntPtr
MsgBox(ExtractIconEx("%systemroot%/shell32.dll", 15, icons, smicons, 1))
Try
MsgBox(icons.Count)
Catch ex As Exception
MsgBox(ex.Message & " by " & ex.Source)
End Try
...
Последующие вызовы всегда вызывают исключение (Value cannot be null
). Я получаю возвращаемое значение 4294967295
, что является максимальным 32-битным целым значением.
Любые идеи о том, как приручить эту функцию и заставить ее работать?
http://pinvoke.net/default.aspx/shell32/ExtractIconEx.html –