String-Probleme
-
Ja, hab den gleichen Compiler verwendet. Warum gehts nicht mit string ???
-
mit const char* klappts ... aber warum gehts mit dem string nicht ?
-
Denke, dass es an der Implementierung von string liegen könnte. (Übergebe mal eine const CString & oder const char * )
-
Bei unterschiedlichen Compilern könnte es sein, dass die std::string Implementationen unterschiedlich sind (hatte da mal ein Problem mit BCB5 und BCB6). Dann funktioniert ein copy nicht.
Wie hast du es denn jetzt?
-
Kommt darauf an, wie std::string die Zuweisung eines Strings behandelt. Wenn er an dieser Stelle keine Kopie macht, sondern mit Referenzen/Zeigern arbeitet
kann es sein, dass die Dll der Applikation die Zeichenkette löscht.
-
Stell auf "Gemeinsame Laufzeitbibliothek".
-
Hi, danke für die vielen schnellen Antworten.
Wie gesagt, habs jetzt mit const char* gelöst, bin damit insgesamt aber nicht sehr zufrieden, da ich in der dll einige Klassen habe und etwaige Statusmeldungen von Klasse zu Klasse "hangeln" muss. Das gefällt mir noch nicht so richtig.
Prinzipiell habe ich folgendes Problem: Ich möchte gerne eine ganze Menge Funktionen in eine DLL packen, aber über ein Logfile zur Laufzeit die Möglichkeit haben, mir von jeder beliebigen Stelle innerhalb der DLL (also auch Klassenübergreifend) Statusmeldungen geben zu lassen.
Wie macht man das möglichst elegant? const char* scheints ja nicht zu sein ...
-
Was hast du denn für Probleme mit const char*? Bzw. wie hast du es jetzt implementiert?
-
Ich weiß nicht, ob das bei deiner Programmstruktur geht, aber du könntest die Status-Informationen intern in einem String packen und bei Bedarf als char* rausgeben:
#include <string.h> using namespace std; // This class is exported from the ImageDLL.dll class IMAGEDLL_API CImageDLL { public: CImageDLL(void); const char* GetState() const; private: string m_sMyState; }; const char* CImageDLL::GetState() const {return m_sMyState.c_str();}(PS: Wenn du - wie in deinem Beispiel - am Anfang der Arbeit die GetState() aufrufst, erhältst du sowieso nur eine Kopie des "Constructor passed" Strings, spätere Statusänderungen siehst du damit nicht - d.h. du müsstest anstelle des "cout<<sBla;" einen Aufruf "cout<<test.GetStringState();" einbauen, um den aktuellen Status zu erhalten)
-
2Atlantis schrieb:
mit const char* klappts ... aber warum gehts mit dem string nicht ?
das von Dir beschrieben Problem tritt gnau dann auf, wenn die DLL und das Programm, das die DLL anzieht nicht mit den gleichen Projekt-Optionen übersetzt wurde.
Kritische Optionen sind: MT, MT-DLL, Debug/Release, Type-Run-Time-Info On/Off, Packagingüberprüf' das mal.
Gruß
Werner