000
07.06.2006, 17:25 Uhr
stephanw
localhorst
|
Hi,
vorab: ich habe gesucht, sowohl hier im Forum als auch in der MSDN. Folgendes Problem:
Ich habe ein Programm, das eine DLL linkt, in der ein paar Klassen enthalten sind. U.a. ein Werkzeug zum Parsen von Kommandozeilen-argumenten. Dann sinngemäß folgender Code:
C++: |
// in der DLL class CommandLineTool { public: // ... bool getValue( const char* option, std::string & value ) const; };
// im Programm
int main(int argc, char** argv) { CommandLineTool commandLineTool( argc, argv );
std::string filename;
if (commandLineTool->getValue( "-f", filename)) { // es wurde ein Dateiname übergeben } }
|
Die Funktion getValue() kopiert dann in den per Referenz übergebenen String. Mir geht es genau um dieses Kopieren. Dieses Beispiel ist nur eines, ich hatte schon zig Beispiele, wo (vorzugsweise mit std-Template-Klassen) das Kopieren per Zuweisung, Copy-Konstruktor o.ä. "über DLL-Grenzen" unter Windows fehlschlägt. Kompiliert man mit MS-VC mit der Einstellung "Multi-Threaded-DLL" o.ä., geht alles gut. Wenn nicht, kommt im Debug-Mode ein "BlockValid" assert oder so ähnlich, habs grad nicht vor mir ;-) Jetzt möchte ich aber mit Cygwin/MinGW g++ kompilieren, dort wüsste ich jetzt kein entsprechendes Flag :-(
Fehler in der Implementierung kann ich ausschließen, es beschränkt sich auf das Kopier-Problem. Beim Kumpel mit Linux/MacOSX klappt das wohl ohne Probleme. DLL und EXE sind jeweils mit demselben Compiler übersetzt.
Meine Frage: ist das ein Problem, was entsteht, weil durch Template/Inline-Generierung potentiell verschiedener Code entsteht, der dann vielleicht nicht zusammenpasst oder ist das ein Problem der Speicher-Verwaltung unter Windows ?
Hat jemand eine Idee, wie ich das mit dem g++ fehlerfrei hinbekomme ?
Ich möchte es möglichst vermeiden, in den DLL-Schnittstellen nur eingebaute Datentypen wie int, float, char* etc. zu benutzen, std-container und strings hätte ich eben gerne. -- Reden ist Schweigen und Silber ist Gold. |