DLL und std::strings als Übergabeparameter



  • Hallo zusammen!
    Ich weiß nicht ob das hierher gehört (__declspec ist nun mal nicht ANSI C++)
    aber ich versuchs mal:

    Also ich habe eine DLL, die eine Funktion

    __declspec(dllexport) void Test(std::string bla);
    

    exportiert. Kompiliert ist sie mit VS2005, ohne Unicode Unterstützung.

    Wenn ich diese DLL aus einer 0815 exe (ebenfalls ohne Unicode) aufrufe mit

    Test("blabla");
    

    dann erhalte ich auf der DLL Seite einen String, der irgendwelche 4 Zeichen enthält und erst dann mein "blabla" erscheint! Das merkwürdige ist: ist die DLL mit Debug kompiliert, erhalte ich den Fehler nicht - nur unter Release. Dabei spielt es keine Rolle, wie die exe kompiliert ist.
    Die DLL wird statisch (mit einer lib) eingebunden.

    Was ich schon immer wissen wollte: gibt es einen Unterschied zwischen einer Debug LIB und einer Release LIB? Ich denk mal nicht aber ich habe sicherheitshalber die korrekte genommen.

    Vielen Dank für Hinweise!

    Gruß

    Mark



  • In den Projektoption für beide Module die Multithreaded-(Debug)-DLL auswählen.



  • Hi,

    VS2005 hat nur noch die multi-threaded DLL's.



  • Also bei mir gibts die Laufzeitbibliothek als statische Library. Aber wichtig ist das du halt in beiden EXE und DLL die gleiche DLL nimmst.

    Also z.B. EXE mit Multithreaded-Debug-DLL und die DLL mit Multithreaded-DLL geht nicht.



  • Ok, disregard 🙄

    Hatte den gleichen Post-build-script und somit Release mit Debug gemischt...
    Das hatte ich aber noch nie, dass sich Debug und Release nicht vertragen können. Man lernt halt immer dazu.

    Und die Libs, bleiben die identisch?

    Gruß,

    Mark



  • Du musst auf jeden Fall die DLL nehmen, damit du eine gemeinsame CRT hast und nicht eine für die EXE und eine für die DLL, sonst funktioniert das nicht.
    Dass Debug und Release verschieden sind sollte klar sein, daher sollte es dich auch nicht wundern, dass das so nicht funktioniert. Denn auch wenn das Verhalten nach außen in Debug und Release scheinbar indentisch ist, so laufen intern andere Routinen ab.

    Debug und Release sollte man nicht mischen. Es lief bei dir sicher bisher immer weil du eine Lib A und eine Lib B hattest die nix miteinander zu tun haben und dann macht es auch nichts, wenn die eine Release und die andere ein Debug Build ist.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum MFC (Visual C++) verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • lolz schrieb:

    Du musst auf jeden Fall die DLL nehmen, damit du eine gemeinsame CRT hast und nicht eine für die EXE und eine für die DLL, sonst funktioniert das nicht.

    In diesem Fall stimmt das.
    Wenn man den String aber als Zeiger oder Referenz übergibt, kannst aber auch nur Multithreaded sein.



  • Pellaeon schrieb:

    lolz schrieb:

    Du musst auf jeden Fall die DLL nehmen, damit du eine gemeinsame CRT hast und nicht eine für die EXE und eine für die DLL, sonst funktioniert das nicht.

    In diesem Fall stimmt das.
    Wenn man den String aber als Zeiger oder Referenz übergibt, kannst aber auch nur Multithreaded sein.

    Hmm wieso denn?

    Und wieso wurde das Posting in das MFC Forum verschoben? Ich habe noch nie in meinem Leben MFC benutzt 🙂

    Mit strings meinte ich die std::string - also die C++ String Klasse.



  • pub00515 schrieb:

    Und wieso wurde das Posting in das MFC Forum verschoben? Ich habe noch nie in meinem Leben MFC benutzt 🙂

    Weil es hier um alle Probleme mit MSVC geht (und DLLs gehören bestimmt nicht zum ANSI C++ Standard). Aber wenn du dich dort wohler fühlst, kann ich dich gerne ins WinAPI-Board weiterschicken.

    Allerdings: Was "Multithreaded" mit der Übergabe von Strings zu tun haben soll, bin ich mir auch nicht sicher. Ich weiß nur, daß du auf beiden Seiten die selben Einstellungen verwenden solltest, sonst kommt es zu Kommunikationsschwierigkeiten.

    Im Debug-Modus werden noch Hilfsinformationen gespeichert und Zusatzaufrufe in den Code eingebaut, damit du in der Lage bist, Fehler verfolgen zu können - wenn du das mit einer Release-Version mischst, tauchen die Zusatzinformationen irgendwo im Objekt auf. (in deinem Fall bedeutet das, daß diese vier Zeichen auch im Debug-Modus da sind, aber die Debug-Version weiß, was sie damit machen soll)



  • CStoll schrieb:

    Allerdings: Was "Multithreaded" mit der Übergabe von Strings zu tun haben soll, bin ich mir auch nicht sicher. Ich weiß nur, daß du auf beiden Seiten die selben Einstellungen verwenden solltest, sonst kommt es zu Kommunikationsschwierigkeiten.

    Wenn Multithreaded, dann muss es natürlich auf beiden Seiten sein, jo. Mischen ist schlecht^^
    Ich meinte nur es geht halt auch ohne "Multithreaded DLL". Dann hauts ihn aber raus, sobald man call by value Klassen übergibt, die in irgendeiner Weise dynamisch Speicher allokieren. Hat jetzt natürlich nichts speziell mit std::string zu tun, sondern gilt allgemein.


Anmelden zum Antworten