aus C++ DLL String o.ä. an VB zurückgeben!



  • Hilfe! Ich bin am Verzweifeln!

    ich will nichts weiter als ein beschissenes Stück Text (mir egal ob char*, String, CString, BSTR, LPCSTR oder wie die ganzen Arschteile auch heißen) in ein VB programm transferieren.

    Ich habe eine DLL mit der Funktion GetMacAddr:

    char* GetMacAddr()

    {
    char* mystring;
    char macStr[30];

    BLA BLA....

    BLA BLA

    myString=macStr;

    return myString;
    }

    in vb ruf ichs so auf:

    Private Declare Function GetMacAddr Lib "C:\Program Files\Microsoft Visual Studio\MyProjects\mr\Release\mr.dll" () As String

    Dim myTest As String

    myTest = GetMacAddr()

    Leider bekomm ich dann nur einen leeren String zurück.

    Hab auch schon probiert den string nicht als rückgabewert sondern als byRef Parameter zu übergeben...

    void GetMacAddr(char* &para)

    in vb:
    Private Declare Function GetMacAddr Lib "C:\Program Files\Microsoft Visual Studio\MyProjects\mr\Release\mr.dll" (byREf para As String)

    dim mystring as string

    GetMacAddr(mystring)

    ausgabe mystring => "BAD DLL CALL CONVENATION" oder speicherfehler oder etc.

    Versuche seit ca. 10 stunden ein bekackte Mac-Adresse als einfaches Textstück an VB zu geben. Bitte bitte helft mir, ich bin echt grantig und verzweifelt.

    Danke!



  • Gib mal in deiner Funktion GetMacAddr das char - Array aus, ob das was drinsteht stimmt, oder ob's hier schon hakt.
    Btw. wenn du C++ nehmen kannst/willst wäre std::string komfortabler als char* :

    std::string GetMacAddr() {
      std::string str;
      //lies Mac-Adresse in str rein
      return str;
    };
    


  • Das char* gibt einwandfrei den richtigen Wert aus (innerhalb der Funktion).

    Ich habe es zuerst mit "string" gehabt, da hats dann aber in VB gekracht, wie ich den Wert einem VB-String zuweisen wollte => Absturtz des ganzen Visual Studios + Speicherfehlermeldung...



  • Übrigens: Wenn ich in VB die Methode als "AS LONG" definiere, dann bekomm ich einen Wert zurück..alerdings nur ein "1347046" statt der Mac-Adresse. Ist das die Long-Versioneiner Speicheradresse? Ich versteh es sowieso nicht (c++-Newbie): ich bekomm ja einen POINTER con c++ zurück...und den pointer weiß ich einer variable zu...aber müsste ich nicht eigentlich das, worauf der Pointer zeigt, in die Variable speichern?? Wenn ja => Wie?



  • in C++ hat ein char 1 Byte, in VB sieht die Sache ein wenig anders aus.
    Da hat ein String nämlich 10 Byte. EDIT: Einzelnes char gibt's da eh net.

    Hier ein Link für dich: http://www.activevb.de/rubriken/kolumne/kol_4/cpptovbtypen.html



  • Danke GPC, den Link habe ich natürlich shcon vor stunden entdeckt *gg* Dort steht auch nur C++ Type = char* => VB-Type = String. Sollte also so gehen.



  • wenn ich deine string-Methode von vb aufruf, kackt alles ab.

    Assembler hier (Fehler tritt in 3. zeile auf):

    [...]
    1000133F mov cl,byte ptr [eax]
    10001341 mov edx,dword ptr [ebp-4]
    10001344 mov byte ptr [edx],cl
    10001346 push 0
    10001348 mov ecx,dword ptr [ebp-4]
    1000134B call 10001620
    10001350 mov eax,[1000D124]
    10001355 push eax
    10001356 push 0
    [...]



  • Eh sorry, aber es ist schon 4 jahre her, dass ich das letzte mal was ernsthaft mit VB gemacht habe .

    Dort steht auch

    Alle Zeigertypen (also datenTyp *varName oder erweiterte C++-Typen mit den Anfangsbuchstaben "LP" (für long pointer)) werden mit dem Long-Datentyp in Visual Basic implementiert (Ausnahme ist char*)

    wobei (wie du sagtest):
    char* -> String
    char[NUM_OF_CHARS] -> String * NUM_OF_CHARS

    Das auch schon gelesen: http://pub13.ezboard.com/fvisualbasicexplorerfrm36.showMessage?topicID=214.topic ??



  • Ja, hab ich leider auch shcon gelesen. Der Typ macht's mit BSTR wobei das bei mir auch nicht funzt.

    Angenommen der Long-Wert den die Funktion zurückgibt ist die SPeicheradresse. Weißt du zufällig, wie ich dann in VB den Wert der Speicheradresse auslesen kann?



  • forsakingmax schrieb:

    Ja, hab ich leider auch shcon gelesen. Der Typ macht's mit BSTR wobei das bei mir auch nicht funzt.

    Fleißig gesucht hast du ja, Respekt. 👍

    Angenommen der Long-Wert den die Funktion zurückgibt ist die SPeicheradresse. Weißt du zufällig, wie ich dann in VB den Wert der Speicheradresse auslesen kann?

    Adresse eines Zeigers kriegst du so raus:

    char *p = "XYZ";
    cout<<&p;
    

    Der Long Wert, den du zurückkriegst, ist der andersweitig interpretierbar, evtl. nach Mac - Adresse?



  • Jetzt hab ich mal in der DLL folgenden Funktion registriert:

    (bei deiner string-variante schmeirt er ja ab):

    char* test() {
    char* str;
    str="huihuihui";
    return str;
    };

    ruf ich jetzt die Funktiion in VB auf, kommt wengistens schonmal keine fehlermeldung - der string, der zurückkommt, ist aber trotzdem leer.

    Private Declare Function test Lib "C:\Program Files\Microsoft Visual Studio\MyProjects\mr\Release\mr.dll" () As String

    myTest = test()



  • Der Longwert ist nicht als MAC-Adresse interpretierbar, höchstens als Adresse => der Schmäh ist ja, dass auch bei diser schlanken Funktion eine Zahle 294584358 zurückkommt, wenn ich die funktion in vb auf LONG umstelle.



  • http://www.flipcode.com/articles/article_vbdlls.shtml

    Ließ da mal den Abschnitt über Strings da steht auch wie man sie returned. Wichtigster Satz:

    In order to return a string, a system function must be called to properly allocate memory for it. Otherwise, the string will disappear when the function terminates and the client will receive garbage.



  • char* test() {
    char* str;
    str="huihuihui";
    return str;
    };
    

    Sorry, das funzt so nicht. Wenn schon:

    char* _stdcall test() {
      static char str[]="huihuihui";
      cout<<"Wert: "<<str<<'\n';
      cout<<"Adresse: "<<&str<<'\n';
      return str;
    };
    

    Was ergeben sich nun für Werte?

    EDIT: Pellaeon recht geb 🙂



  • mal was anderes einwerf, auch wenns daran jetzt evtl nicht liegt: VB kann doch nur stdcall benutzen dachte ich. Wenn ich deine Funktion sehe, die du exportierst, hast du ja kein __stdcall mit hingeschrieben ...



  • @GPC: doch, meine Variante funzt. Wenn ich die funktion in C++ aufrufe, haut alles hin. Gleiche wert bei deiner variante.

    @Pellaeon: Was bedeuted __stdcall dazuzuschreiben? Habs getan, macht aber no difference.

    asdrubael, das klingt gut, schau ich mir mal an! Danke!



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten