2009-07-24 5 views
0

Ich habe eine DLL auf VC6 generiert und wstring verwenden, und ich versuche, es in einem VC9-Projekt zu verwenden. In dieser DLL gibt es eine Klasse der höheren Ebene, die wstring, genannt UtfString, manipuliert.Bad Zeiger oder Link Problem beim Erstellen Wstring von Vc6 Dll

Ich habe alles richtig in meinem Projekt importiert, aber wenn ich rufe:

std::wstring test; 
UtfString uTest(test); 

es wird nicht verknüpfen, auch wenn der Funktionsprototyp in den lib ...

Die anderen Emittenten Wenn ich einen neuen UtfString erzeuge und meine App debugge, ist der neue Zeiger <Bad Ptr>.

Ich vermute einen Konflikt zwischen VC6 wstring und VC9 wstring aber ich bin mir nicht sicher. Ich möchte vermeiden, die ursprüngliche DLL zu ändern.

Es wäre großartig, wenn jemand die Dinge für mich klarer machen und mir erklären könnte, was der wahre Grund des Problems ist.

Vielen Dank im Voraus für Ihre Antwort, Boris

+0

Ich würde erwarten, dlls zu unterschiedlichen Laufzeiten verknüpft ziemlich unvereinbar ja sein. Was sind die Fehler? Welcher Zeiger? – Eugene

+0

Überprüfen Sie auch Ihre "treat wchar_t als eingebauten Typ" Einstellungen. – Eugene

Antwort

2

DONT

sogar versuchen, die String-Layouts sind verschiedene

Sie das nicht tun können.

Die String-Klasse unterscheidet sich zwischen VC6 und VC9.

Auch wenn Sie in der Lage waren zu verknüpfen, werden Sie höchstwahrscheinlich abstürzen.

In VC9 haben Strings eine Union, die 16 Byte Puffer für kleine Strings und ein Zeiger für String s.t. ist. Größe()> 15. In VC9 wstrings haben eine Union, die 8 wchar Puffer für kleine Strings und ein Zeiger für String s.t. ist. Größe()> 7.

in VC6 alle Zeichenfolgenpufferspeicherplatz auf dem Heap reserviert ist.

Sie müssen die DLL neu kompilieren, wenn Sie Zeichenfolgen über die Grenze übergeben. Es gibt noch andere Probleme in Bezug auf Iteratoren, die zu technisch sind, um sie hier zu beschreiben.

leid Gotta wieder aufzubauen

+0

Und der Name Mangling spiegelt wider, dass die VC6 und VC9-Strings wirklich unterschiedliche Typen sind. – MSalters

+0

Danke für deine Antwort, das habe ich letzte Nacht herausgefunden. Leider kann ich meine DLL nicht mit VC9 neu kompilieren. Also meine Lösungen sind, entweder einen String-Wrapper in VC6 zu machen, oder die Funktionsprototypen zu ändern und den wstring durch char * oder wchar_t zu ersetzen. –

+0

Wissen Sie, ob ich das gleiche Problem mit wchar_t habe? soll ich char * nur benutzen? –