Я написал свою собственную функцию, которая в C была бы объявлена следующим образом, используя стандартные Win32 соглашения о вызовах:
int Thing( char * command, char * buffer, int * BufSize);
У меня есть следующий объем кода Visual Basic, который должен импортировать файл DLL и вызвать эту функцию, оборачивая его, чтобы было проще вызывать Thing ("CommandHere", GetDataBackHere).
ОБНОВЛЕНИЕ: Этот код теперь является рабочим решением, как показано здесь:
Imports Microsoft.VisualBasic
Imports System.Runtime.InteropServices
Imports System
Imports System.Text
Namespace dllInvocationSpace
Public Class dllInvoker
' I tried attributes, but I could not make it build:
' <DllImport("thing1.dll", False, CallingConvention.Cdecl, CharSet.Ansi, "Thing", True, True, False, True)>
Declare Ansi Function Thing Lib "thing1.dll" (ByVal Command As String, ByRef Buffer As StringBuilder, ByRef BufferLength As Integer) As Integer
' This part contributed by helpful user:
Shared Function dllCall(ByVal Command As String, ByRef Results As String) As Integer
Dim Buffer As StringBuilder = New StringBuilder(65536)
Dim Length As Integer = Buffer.Capacity
Dim retCode As Integer = Thing(Command, Buffer, Length)
Results = Buffer.ToString()
'Debug.Assert(Results.Length = Length) ' This assertion is not true for me
Return retCode
End Function
End Class
End Namespace
Я получил код для сборки, следуя полученной здесь помощи, а затем я забыл As Return Type
(который дал мне MarshalDirectiveException PInvokeRestriction). Затем в моей DLL произошел сбой подтверждения, что привело к исключению SEHException. После исправления это работает КРАСИВО. Спасибо, ребята. Существуют группы новостей, в которых люди говорят, что это невозможно, поскольку Visual Basic загружает только управляемые сборки DLL (что, как мне кажется, является обычной вещью, к которой привыкли большинство пользователей Visual Basic).