c++ dll in vb.net: Parameter (datentypen) Probleme!
-
Hi,
ich habe folgende einfache c++ dll:
extern "C" __declspec(dllexport) __int64 _stdcall XArCAPIFunc(char* xml, __int64 Zahl1, __int64 Zahl2, __int64 Zahl3) { return Zahl1 + Zahl2; }In einer VB.net Konsolenanwendung rufe ich diese wie folgt auf:
Module Module1 Private Declare Function Funktion Lib "C:\Dokumente und Einstellungen\xxx\Desktop\test\C PLUS PLUS\dllVersuch\Debug\dllVersuch.dll" Alias "_Funktion@28" (ByVal xml As String, ByRef Zahl1 As Long, ByRef Zahl2 As Long, ByVal Zahl3 As Long) As Long Sub Main() Console.WriteLine(Funktion("test", 1, 2, 3)) Console.ReadLine() End Sub End ModuleDen Alias-Namen für die Funktion "_Funktion@28" habe ich via dumpbin.exe /exports dllVersuch.dll herausgefunden.
Meine erste Frage: Warum funktioniert das so nicht? Normalerweise müsste meine Ausgabe doch sein: 3 (weil 1+2 = 3)...
Stattdessen erhalte ich folgenden Fehler:Ein Aufruf an die PInvoke-Funktion "TestKonsole1!TestKonsole1.Module1::Funktion" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
Danke für eure Hilfe,
schnitzl0r
-
Funktion nimmt zwei Parameter, Du importierst sie aber mit vier Parametern.
-
LordJaxom schrieb:
Funktion nimmt zwei Parameter, Du importierst sie aber mit vier Parametern.
Sorry, war falsch kopiert. Ist editiert.
-
In deiner C++-Funktion hast du 2 Parameter vom Typ __int64 bzw. Quadword. In deiner VB-Funktions-Dekleration hast du 1 Parameter vom verwalteten Typ System.String und 3 vom Typ Long. Fällt dir was auf?
edit: Mist, einer war schneller

-
Du konvertierst System.String in char*. Wenn dann musst du Über System.Text.Encoding.irgendwas deinen System.String in ein Byte-Array konvertieren. Weiß jetzt aber grade nicht wie du das mit dem Zeiger hinkriegst.
edit: Ach ja, wenn du den String weiterverarbeiten willst denk dran das .NET Unicode benutzt und char für ASCII Zeichen ausgelegt ist.
-
das verstehe ich nicht so ganz?