Guten Abend Community
Ich versuch eine normale string Array an eine C/C++ Dll zu übergeben und diese wieder zurückzugeben.
Irgendwie will das nicht funktionieren. Strings zu übergeben ist kein Problem, da habe ich viele Beispiele im Netz gefunden. Jedoch wie kann man eine Array übergeben?
Vielen dank für die Hilfe
Freundliche Grüsse
exc-jdbi
Hier die C/C++ DLL
Der VB.Net Code
[highlight=vbnet]
Dim p1, p2, p3, p4 As IntPtr
Try
Dim strTxt As String = String.Empty
Dim str As String = "Ich bin ein String"
Dim strArrBack As String() = {}
Dim strArr As String() = {"Ich", "bin", "eine", "Array"}
p1 = Marshal.StringToHGlobalAnsi(str)
p2 = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr.Zero))
'Wie muss ich die Array hier deklarieren
'p3 = Marshal.
p4 = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr.Zero))
If (dll.Test(p1, p2, p3, p4) <> 0) Then
Dim p As IntPtr = Marshal.ReadIntPtr(p2)
strTxt = Marshal.PtrToStringAnsi(p)
p = Marshal.ReadIntPtr(p3)
'Wie muss die Rückgabe gemarshelt werden
'strArrBack=
End If
Finally
Marshal.FreeHGlobal(p1)
Marshal.FreeHGlobal(p3)
End Try
[/highlight]
[highlight=vbnet]
'Ist in einer Classe dll
<DllImport("Test.dll")> _
Public Shared Function Test(ByRef str As IntPtr, ByRef strR As IntPtr, ByRef arr As IntPtr, ByRef arrR As IntPtr) As Integer
End Function
[/highlight]
Ich versuch eine normale string Array an eine C/C++ Dll zu übergeben und diese wieder zurückzugeben.
Irgendwie will das nicht funktionieren. Strings zu übergeben ist kein Problem, da habe ich viele Beispiele im Netz gefunden. Jedoch wie kann man eine Array übergeben?
Vielen dank für die Hilfe
Freundliche Grüsse
exc-jdbi
Hier die C/C++ DLL
Code:
extern "C" __declspec(dllexport) BOOL _stdcall Test(char *s,char **pStr,char **cArrStr,char ***pArr) { *pStr=s; int intSize=sizeof(cArrStr)/sizeof(&cArrStr[0]); static std::vector<char*>vArr(intSize); for(int i=0;i<intSize;i++) { vArr.push_back(cArrStr[i]); } *pArr=vArr.data(); return TRUE; }
[highlight=vbnet]
Dim p1, p2, p3, p4 As IntPtr
Try
Dim strTxt As String = String.Empty
Dim str As String = "Ich bin ein String"
Dim strArrBack As String() = {}
Dim strArr As String() = {"Ich", "bin", "eine", "Array"}
p1 = Marshal.StringToHGlobalAnsi(str)
p2 = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr.Zero))
'Wie muss ich die Array hier deklarieren
'p3 = Marshal.
p4 = Marshal.AllocHGlobal(Marshal.SizeOf(IntPtr.Zero))
If (dll.Test(p1, p2, p3, p4) <> 0) Then
Dim p As IntPtr = Marshal.ReadIntPtr(p2)
strTxt = Marshal.PtrToStringAnsi(p)
p = Marshal.ReadIntPtr(p3)
'Wie muss die Rückgabe gemarshelt werden
'strArrBack=
End If
Finally
Marshal.FreeHGlobal(p1)
Marshal.FreeHGlobal(p3)
End Try
[/highlight]
[highlight=vbnet]
'Ist in einer Classe dll
<DllImport("Test.dll")> _
Public Shared Function Test(ByRef str As IntPtr, ByRef strR As IntPtr, ByRef arr As IntPtr, ByRef arrR As IntPtr) As Integer
End Function
[/highlight]
Comment