Недавно, когда писал перебор окон, столклулся с тем, что, если функция описана как получающая аргумент типа List(Of IntPtr), то при её вызове выкидывается исключение Cannot marshal 'parameter #2': Generic types cannot be marshaled.. После замены на IList всё заработало.
Хотелось бы узнать больше о передаче параметров в функции (особенно WinApi) и других ситуациях, в которых важен факт того, класс или интерфейс указан в описании функции. Буду рад получить ссылки на статьи, книги или обсуждения. Сам ничего на эту тему не нашёл.
- Код: Выделить всё
Module EnumWithInterfaseArgument
Private Delegate Function WindowEnumerator(ByVal hwnd As IntPtr, ByVal lparam As IList) As Boolean
Private Declare Function EnumWindows Lib "user32" Alias "EnumWindows" (ByVal lpEnumFunc As WindowEnumerator, ByVal lparam As IList) As Integer
Private Function AddToList(ByVal hwnd As IntPtr, ByVal Result As IList) As Boolean
Result.Add(hwnd)
Return True
End Function
Public Function GetAllWindows() As List(Of IntPtr)
Dim Result As New List(Of IntPtr)
EnumWindows(AddressOf AddToList, Result)
Return Result
End Function
End Module
Module EnumWithClassArgument
Private Delegate Function WindowEnumerator(ByVal hwnd As IntPtr, ByVal lparam As List(Of IntPtr)) As Boolean
Private Declare Function EnumWindows Lib "user32" Alias "EnumWindows" (ByVal lpEnumFunc As WindowEnumerator, ByVal lparam As List(Of IntPtr)) As Integer
Private Function AddToList(ByVal hwnd As IntPtr, ByVal Result As List(Of IntPtr)) As Boolean
Result.Add(hwnd)
Return True
End Function
Public Function GetAllWindows() As List(Of IntPtr)
Dim Result As New List(Of IntPtr)
EnumWindows(AddressOf AddToList, Result)
Return Result
End Function
End Module
Module Main
Public Sub Main()
Try
EnumWithInterfaseArgument.GetAllWindows()
MsgBox("Ready", MsgBoxStyle.Information, "EnumWithInterfaseArgument")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "EnumWithInterfaseArgument")
End Try
Try
EnumWithClassArgument.GetAllWindows()
MsgBox("Ready", MsgBoxStyle.Information, "EnumWithClassArgument")
Catch ex As Exception
MsgBox(ex.Message, MsgBoxStyle.Critical, "EnumWithClassArgument")
End Try
End Sub
End Module
PS: У меня есть некоторые сомнения по поводу выбора этого раздела форума. Надеюсь, что не ошибся.