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



  • 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