FighterFigger Geschrieben 27. April 2003 Geschrieben 27. April 2003 Hallo mal wieder. Ich habe heute mal ein Problem mit einem ostream. Eine Funktion in einer kleinen DLL soll von der Anwendung einen Stream bekommen, und darauf schreiben. [COLOR=green]// In der DLL[/COLOR] void Klasse::Meine Funktion(std::ostream& os) { os << 1.5 << std::endl; } nun rufe ich aus der Anwendung die Funktion mit cout [COLOR=green]// In der Anwendung[/COLOR] kl.MeineFunktion(std::cout); Dabei wird eine Exception geworfen: "missing locale facet" Komischerweise entsteht der Fehler nur, wenn Ich in der Funktion einen Zahlwert ausgeben möchte, auf den Stream, den ich ihm übergeben habe. Der Fehler entsteht nicht, wenn ich in derselben Funktion direkt auf std::cout schreibe, oder wenn ich die Funktion aus der Klasse löse und sie global in die Anwendung bette. Was habe ich vergessen - liegt es an der DLL und der Parameterübergabe? Zitieren
Klotzkopp Geschrieben 28. April 2003 Geschrieben 28. April 2003 Original geschrieben von FighterFigger Was habe ich vergessen - liegt es an der DLL und der Parameterübergabe? Ich tippe auf die Laufzeitbibliothek. Falls du die DLL und das Programm mit unterschiedlichen oder statischen Versionen der Laufzeitbibliothek verlinkst, versuch mal, die Runtime bei beiden auf "Multithreaded DLL" oder "Multithreaded Debug DLL" zu setzen. Zitieren
FighterFigger Geschrieben 28. April 2003 Autor Geschrieben 28. April 2003 Nein - sorry. Das ist es nicht. Meine Anwendung ist SingleThreaded (debug) und meine DLLs alle MultiThreaded(debug). Verwirrend ist für mich eben, daß ich aus der besagten Funktion heraus mühelos direkt in cout schreiben kann. Nur wenn ich cout als ostream übergebe entsteht der Fehler während der Laufzeit. Und das eben auch nur, wenn die Funktion dort in der DLL liegt. Zitieren
Klotzkopp Geschrieben 28. April 2003 Geschrieben 28. April 2003 Original geschrieben von FighterFigger Nein - sorry. Das ist es nicht. Meine Anwendung ist SingleThreaded (debug) und meine DLLs alle MultiThreaded(debug).Und genau das ist ein Problem, denn damit hast du mehr als eine Laufzeitumgung in deinem Programm. Die Folge davon ist, dass statische/globale Objekte der Laufzeitumgebung mehrfach vorhanden sind. Es könnte so sein, dass ein globales Default-facet-Objekt der Laufzeitumgebung der Anwendung initialisert wird, dann aber das (uninitialiserte) der Laufzeitumgebung der DLL verwendet wird. Zitieren
FighterFigger Geschrieben 28. April 2003 Autor Geschrieben 28. April 2003 Naja - wenn alle DLLs MultiThreadedDLL(debug) sind, hilft das auch nicht. Auch, wenn ich sogar die Anwendung MultiThreaded mache. DLLs aber SingleThreaded zu machen, ist eine dumme Idee (oder?) ... Dann muß ich also locale facet selber setzen, wie auch immer das geht ... oder die Doubles, um die es mir geht, selbständig vorher in Strings umwandeln ... ... oder gibt es noch eine Alternative? Zitieren
Klotzkopp Geschrieben 28. April 2003 Geschrieben 28. April 2003 Original geschrieben von FighterFigger Naja - wenn alle DLLs MultiThreadedDLL(debug) sind, hilft das auch nicht. Auch, wenn ich sogar die Anwendung MultiThreaded mache.Hast du auch die Anwendung auf MultiThreadedDLL(debug) gesetzt? Alle Komponenten, als Anwendung und DLLs, sollten die gleiche Runtime verwenden. Zitieren
FighterFigger Geschrieben 28. April 2003 Autor Geschrieben 28. April 2003 ungelogen Klotzkopp ... ich bewundere dich von Thread zu Thread mehr. Es hat geklappt, und ich habe eines gelernt: "FF, ließ dir mal genau durch, was du da alles eingestellt hast!" Ich dachte, eine Anwendung würde mit der Laufzeitumgebung einer MultiThreadedDLL nix anfangen, weil sie keine DLL ist. Typisches Beispiel von "Prinzip nicht verstanden" ... Danke ... und wieder rein in den Code ... Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.