Como importar e chamar DLL não gerenciada com a string de ponteiro ANSI C string “char *” do VB.NET?
Eu escrevi minha própria função, que em C seria declarada assim, usando o padrãoWin32 convenções de chamada:
int Thing( char * command, char * buffer, int * BufSize);
Eu tenho a seguinte quantidade de código do Visual Basic calculada, que deve importar o arquivo DLL e chamar essa função, agrupando-a para facilitar a chamada de coisa ("CommandHere", GetDataBackHere).
ATUALIZAÇÃO: Este código agora é uma solução funcional, como mostrado aqui:
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
Obtive o código para compilar seguindo a ajuda recebida aqui e depois esqueci oAs Return Type
(que me deu um MarshalDirectiveException PInvokeRestriction). Então tive uma falha de declaração dentro da minha DLL, o que levou a uma SEHException. Uma vez consertado, isso funciona MUITO BEM. Obrigado pessoal. Existem grupos de notícias em que as pessoas dizem que isso não pode ser feito, que o Visual Basic carrega apenas assemblies DLL gerenciados (o que eu acho que é a coisa normal com a qual a maioria dos usuários do Visual Basic está acostumada).