String-Probleme
-
Steh grad auf dem Schlauch.
In einer DLL habe ich diese Klasse hier (bin ganz am Anfang, daher ist sonst nichts drin):
#include <string.h>
using namespace std; // This class is exported from the ImageDLL.dll class IMAGEDLL_API CImageDLL { public: CImageDLL(void); string GetStringState(); private: string m_sMyState; };Mit dem String möchte ich Statusmeldungen von der DLL an die MFC-Anwendung schicken, um sie da in einem Log-Fenster anzeigen zu können. Im cpp-File siehts dann so aus:
CImageDLL::CImageDLL() { m_sMyState = "Successfully passed constructor of DLL"; return; } string CImageDLL::GetStringState() { return m_sMyState; }In der MFC-Anwendung rufe ich dann folgendes auf:
CImageDLL test; string sBla = test.GetStringState(); // Set the Edit-control as logger destination m_EditLogger.SetEditCtrl( m_strEdit.m_hWnd ); // Redirect cout to our Edit-Control m_pOldBuf = cout.rdbuf( &m_EditStrBuf ); // and also the unicode version m_pOldBufW = wcout.rdbuf( &m_EditStrBufW ); // Check it cout << "successfully loaded InitDialog" << endl; wcout << L"UNICODE) works" << endl; cout << sBla; cout << "\n\n";Bevor jetzt jemand kommt und fragt, warum ich denn cout bei MFC benutze, der kann hier gucken : http://www.codeproject.com/editctrl/editlog.asp
Das funktioniert immer ohne Probleme - bis jetzt.Im Debug geht's auch über den Punkt
cout << sBla;hinaus, aber dann kommt ein Heap-Fehler. Warum versucht er, den String zu löschen?
-
Hallo,
Lass deine dll mal lieber einen const char* statt einen string zurückgeben.
Hast du die Dll und die Anwendung mit dem selben Compiler erstellt?
-
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