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 Module
    

    Den 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?


Anmelden zum Antworten