String-Problem in DLL



  • Hallo allerseits.

    Ich will eine DLL in C++ schreiben, die ich dann später in VB nutzen kann (Standard-DLL nicht COM). Wenn ich normale int-Funktionen oder Parameter erstelle funktioniert soweit alles ganz gut. Jetzt möchte ich natürlich aber auch mal mit Strings arbeiten. Habe mir im Internet einige Tutorials angeschaut und habe dann folgenden Code zum Testen erstellt:

    char* __stdcall GetName()
    {
    return "Name";
    }

    Dann habe ich die Funktion in eine .DEF-Datei eingetragen, damit der Name richtig exportiert wird (mit DependencyWalker kontrolliert, passt).
    Rufe ich jetzt die Funktion in VB6 auf:
    'Deklaration der Funktion
    Declare Function GetName Lib "testdll.dll" () As String

    dann kommt so ein hässliches Fenster "der Vorgang read konnte..." und wie der Text dann halt so weiter geht.
    Kann mir da einer helfen? 🙂



  • zieh dir erstmal die basics rein:

    How to pass arrays and strings between Visual Basic and C functions or between Visual Basic and C++ functions by using Visual Basic

    [msdn]http://support.microsoft.com/default.aspx?scid=kb;en-us;205277[/msdn]



  • OK, das ist ja soweit klar.
    Ich möchte aber einen String nicht nur als Parameter übergeben können, sondern ich möchte von der DLL einen String als Funktionswert erhalten.
    Die Übergabe als Parameter klappt wunderbar, aber es muss doch auch möglich sein, einen String-Wert von einer Funktion zu erhalten.



  • Das liegt wohl daran, dass der Rückgabewert ein Zeiger auf einen String und kein String ist.



  • Es muss doch auch eine Lösung geben für das Problem. Schließlich werden von manchen Windows-Funktionen auch Strings in VB zurückgegeben.
    Vielleicht hat ja jemand schon einmal soetwas gemacht.



  • Es muss doch auch eine Lösung geben für das Problem. Schließlich werden von manchen Windows-Funktionen auch Strings in VB zurückgegeben.

    Nein wird nicht. Jedenfalls nicht als Rückegabewert, sondern nur als Referenz in der Paramerterliste:

    z.B.

    int WINAPI GiveMeAString( char* strBuffer, int maxlen )
    {
        strcpy(strBuffer, "Das ist ein Test", maxlen);
        return 16;
    }
    

    VB

    Private Declare Function GiveMeAString Lib "meinedll.dll" (Byval strBuffer As String, Byval maxlen As Integer) As Long
    
    ...
    'String der Größe 256(oder welche Größe auch immer) erstellen und mit 0 Bytes füllen! Wichtig!
    Dim myBufffer as String
    Dim intStrLen as long
    myBuffer = String(0, 256) 
    intStrLen = GiveMeAString( myBuffer, 256)
    MsgBox myBuffer
    

    Müsste eigentlich funktionieren.


Anmelden zum Antworten