Liebe VB Gemeinde,
ich möchte mit VB.net (Visual Studio 2013) eine C++.dll (unmanaged) aufrufen. Dabei habe ich meiner Meinung nach ein Problem mit der Übergabe eines Parameters (Doppelpointer).
Der unten beschrieben Programmcode dient mir als kleines "Testprojekt" zum verstehen und ausprobieren.
-----
Die Funktion wurde in C++ folgendermaßen definiert, bevor sie in eine .dll umgewandelt wurde:
XXX_API double TestAdd(double ** a)
{
return *(a[0]) + *(a[1]);
}
-------
Im C++ Header-file:
XXX_API double TestAdd(double ** a);
------
Ich habe ein C++ Beispielprojekt das funktioniert indem die DLL verwendet wird, der Aufruf sieht so aus:
int main(void)
{
// zwei normale double Variablen anlegen und mit Werten belegen
double a = 6;
double b = 7;
// Ein Array der Größe 2 von double Zeigern erzeugen
double * vars[2];
// jeweils die Adresse der double Variablen in das Array schreiben
vars[0] = &a;
vars[1] = &b;
// Test Add aufrufen und den Wert ausgeben
cout << a << " + " << b << " = " << TestAdd(vars) << endl;
system("pause");
}
Ergebnis = 13
------
Nun möchte ich die besagte DLL aus meinem VB.net Projekt aufrufen (Zielframework 4.5.2)
Ich habe keine Idee wie der Aufruf, bzw. wie ich diesen "Doppelpointer" (double ** a) aus C++ in Vb.net übergeben/ übersetzen soll?
Mein aktueller VB-Code:
Imports System.Runtime.InteropServices
<DllImport("C:\NameDerDLL.dll", CharSet:=CharSet.Auto, SetLastError:=True, _
EntryPoint:="TestAdd", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function TestAdd(ByRef test()() As Double) As Double
End Function
Dim dblResult As Double
dblResult = TestAdd(test)
a dachte ich, ist ein Array von einem Array vom Typ Double und das entspräche ()() - passt aber nicht
Fehlermeldung:
Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.MarshalDirectiveException" ist in VBDLLTestProject.exe aufgetreten.
Zusätzliche Informationen: "parameter #1" kann nicht gemarshallt werden: Für geschachtelte Arrays ist keine Marshallunterstützung vorhanden..
Unterstützt vb.net überhaupt Zeiger, bzw. kann das überhaupt so in VB.net umgesetzt werden?
Vielen Dank schon mal Vorab!
Grüße
Moc
ich möchte mit VB.net (Visual Studio 2013) eine C++.dll (unmanaged) aufrufen. Dabei habe ich meiner Meinung nach ein Problem mit der Übergabe eines Parameters (Doppelpointer).
Der unten beschrieben Programmcode dient mir als kleines "Testprojekt" zum verstehen und ausprobieren.
-----
Die Funktion wurde in C++ folgendermaßen definiert, bevor sie in eine .dll umgewandelt wurde:
XXX_API double TestAdd(double ** a)
{
return *(a[0]) + *(a[1]);
}
-------
Im C++ Header-file:
XXX_API double TestAdd(double ** a);
------
Ich habe ein C++ Beispielprojekt das funktioniert indem die DLL verwendet wird, der Aufruf sieht so aus:
int main(void)
{
// zwei normale double Variablen anlegen und mit Werten belegen
double a = 6;
double b = 7;
// Ein Array der Größe 2 von double Zeigern erzeugen
double * vars[2];
// jeweils die Adresse der double Variablen in das Array schreiben
vars[0] = &a;
vars[1] = &b;
// Test Add aufrufen und den Wert ausgeben
cout << a << " + " << b << " = " << TestAdd(vars) << endl;
system("pause");
}
Ergebnis = 13
------
Nun möchte ich die besagte DLL aus meinem VB.net Projekt aufrufen (Zielframework 4.5.2)
Ich habe keine Idee wie der Aufruf, bzw. wie ich diesen "Doppelpointer" (double ** a) aus C++ in Vb.net übergeben/ übersetzen soll?
Mein aktueller VB-Code:
Imports System.Runtime.InteropServices
<DllImport("C:\NameDerDLL.dll", CharSet:=CharSet.Auto, SetLastError:=True, _
EntryPoint:="TestAdd", CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function TestAdd(ByRef test()() As Double) As Double
End Function
Dim dblResult As Double
dblResult = TestAdd(test)
a dachte ich, ist ein Array von einem Array vom Typ Double und das entspräche ()() - passt aber nicht
Fehlermeldung:
Ein Ausnahmefehler des Typs "System.Runtime.InteropServices.MarshalDirectiveException" ist in VBDLLTestProject.exe aufgetreten.
Zusätzliche Informationen: "parameter #1" kann nicht gemarshallt werden: Für geschachtelte Arrays ist keine Marshallunterstützung vorhanden..
Unterstützt vb.net überhaupt Zeiger, bzw. kann das überhaupt so in VB.net umgesetzt werden?
Vielen Dank schon mal Vorab!
Grüße
Moc