Wie übergebe ich einen String in eine DLL?



  • Moin
    In meinem Programm hab ich bis jetzt nur die "schlechte" Variante das ich die Stings in einer Ini Speicher und dann in der DLL wieder auslese. Da diese Variante nicht nur langsam ist sondern auch noch irgendwie umständlich ist, wollte ich halt Fragen ob jemand ne Idee hat ob und wie das geht.
    Ich hab schon mal nach Themen gesucht bin aber nicht wirklich schlau draus geworden.



  • char-Zeiger sind da wohl die portabelste Methode....

    -junix



  • Kannst du mir sagen was genau ich machen muss oder ein stück Quelltext zeigen?



  • Godspeed schrieb:

    Kannst du mir sagen was genau ich machen muss oder ein stück Quelltext zeigen?

    Äh du wirst doch wohl noch nen Funktionskopf zusammenkriegen der nen Char-Zeiger erwartet?!?

    -junix



  • Hi,

    für mich ist jetzt erstmal interessant, wie du die DLL lädst.
    Wenn du sie implizit bindest, dann kannst du das so machen, wie du es auch bei "ganz normalen" Funktionen machst.
    Wenn du explizit bindest, dann besteht der einzige Unterschied darin, dass du dir vorher ein Handle auf die Funktion holen musst. Dann kannst du allerdings es wieder genauso tun, wie beim impliziten Binden.

    //int myFunc (char *)
    
    int Res = myFunc ("Ein Spruch");
    

    Maffe

    @junix: Nur nochmal ein bisschen genauer erklärt. 😉



  • Ich hab mich bei meiner Programm erstellung an das Tutorial http://bcb-tutorial.c-plusplus.net gehalten und lade die Dll Dynamisch, wenn du das meinst mit explizit. Hab mich gerade erst an das Thema Dll rangewagt und weiss nicht was ich alles ändern muss bei meinem Quelltext.



  • Ok, ich mal kurz reingeschaut. Du bindest explizit. Allerdings glaube ich nicht, dass das Problem jetzt bei deinen Kenntnissen über DLLs liegt, kleiner Tip setz dich nochmal mit C++ in Sachen Strings auseinander. (Ist nicht böse gemeint.)

    Wenn du's so machst, wie im Tut, dann kannst du nach dem Abarbeiten von "GetProcAddress" mit dem Pointer genauso arbeiten, wie mit einem normalen Funktionsaufruf.
    Ich hab mir angewöhnt zu jeder DLL, die ich schreibe, eine Funktion "Init" zu schreiben, in der ich dann alles übergebe, was ich aus der Anwendung brauche.
    Hier ein kleines Beispiel.

    //DLL.cpp
    char DLLPipe_Name[100]; //globale Variablen
    char DLLEvent_Name[100];
    
    int Init (char *Pipe_Name, char *Event_Name, int Modus)
    {
      sprintf (DLLPipe_Name, Pipe_Name); //Kopieren der Strings
      sprintf (DLLEvent_Name, Event_Name); 
      ..
      ..
    }
    
    //App.cpp
    
    int myFunc ()
    {
      HINSTANCE hDLL = LoadLibrary ("DLL");
      ..
      typedef int (*TInit) (char *, char*, int);
      TInit pInit = (TInit) GetProcAddress (hDLL, "_Init");
      int Res = pInit ("\\\\.\\pipe\\myPipe", "DLLEvent", 1);
      ..
      ..
    }
    

    Ich hoffe, das erklärt es jetzt ein bisschen. (Nicht ärgern, nobody is perfect! :))

    Maffe



  • Danke für die Hilfe, werde es mal ausprobieren und nochmal ein bisschen mein wissen über Strings erweitern(hab wohl in der Schule nicht genug aufgepasst 🙂 )



  • hallo,

    mach dir keine sorgen, bei diesem thema (strings an dll übergeben und andersrum) sind schon ganz andere leute wahnsinnig geworden, und die
    idee mit der ini ist so stümperhaft auch wieder nicht. denn wenn du
    mit ansistrings arbeiten willst musst du ja den ganzen müll (die borland-
    zusatz-dlls wie im header beschrieben) einbinden. und das mit den char-
    zeigern funktioniert schon, kann aber wieder andere probleme nach sich ziehen,
    du musst einfach etwas herum experimentieren und die für dich (dein
    prog) beste lösung herausfinden. wenn manchmal ganz sonderbare
    dinge geschehen, scheue dich nicht, den pc mal neuzustarten, oder wenigstens
    "xy abmelden", denn aus eigener erfahrung weiss ich, das code, der am
    späten abend überhaupt nicht funktionierte, am näxten morgen wie von
    geisterhand auf einmal perfekt ausgeführt wurde...

    mfg
    murphy


Anmelden zum Antworten