Ich habe ein Problem beim Teilen von "std :: string" -Daten zwischen MS Visual C ++ - DLL-Bibliothek und Qt-Programm.
DLL-Bibliothek in Visual C ++ 2010 Express geschrieben, die eine Methode exportiert:
%Vor%Abstrakte Schnittstelle "ITest" und eine Klasse, die es implementiert:
%Vor%Qt-GUI-Anwendung, die Folgendes benötigt:
%Vor%In DLL's "Init" wird eine "CTest :: getVersion ()" Methode aufgerufen. Ich würde erwarten, dass die Zeichenfolge "& amp; version" ausgefüllt wird. Was ich stattdessen bekomme, sind Abstürze in der Zeile, wenn ich "& amp; version" mit einer neuen Zeichenfolge fülle.
heruntergeladen "Qt-Bibliotheken 4.8.3 für Windows (VS 2010, 235 MB)" von Ссылка , installiert es und habe es in den Projekteinstellungen von QtCreator ausgewählt.
in QtCreator wechselte von der MinGW Toolchain zu der mit MS Visual Studio 2010 Express installierten Version.
Ich dachte, dass es das Problem überwinden wird, weil ich Qt-Bibliotheken verwendet habe, die mit VS 2010 kompiliert wurden, und die Qt-GUI wurde dann auch mit der VS C ++ - Toolchain kompiliert. Leider war das Problem nicht weg, also habe ich den letzten Schritt versucht:
erstellte Win32-Konsole-Anwendung in Visual Studio, lud meine DLL über LoadLibrary, verwendete "Init" -Methode genauso wie ich es in Qt GUI getan hatte ... und es funktionierte !!
In "CTest :: getVersion ()" drucke ich diese "Version" Zeichenfolge, die als Referenz an die Konsole übergeben wird. Wenn Sie die VS C ++ - Konsolenanwendung als Host verwenden, wird sie korrekt ausgedruckt. Bei Verwendung von Qt-App - die "Version" Zeichenfolge wird mit etwas Müll um gedruckt (z. B. ┌►☻qwerty27)
Das lässt mich denken, dass ABI der Qt-App und meiner DLL immer noch inkompatibel ist, selbst wenn ich die oben erwähnten Qt VS 2010-Bibliotheken verwende.
In einem Projekt hatte ich eine Situation wie deine, zwei DLLs, denselben Compiler (VC ++ 2010). Ich habe std :: string von einem zum anderen übergeben und viele Abstürze bekommen.
Das Problem war, dass eine DLL mit Multi-threaded Debug-DLL (/ MDd) kompiliert wurde und die andere mit Multithread-Debugging (/ MTd) diese binäre Inkompatibilität verursachte zwischen den beiden DLLs (Abstürze). Auch die Versionen müssen übereinstimmen, verwenden Sie entweder DEBUG oder RELEASE für beide DLLs.
Wenn Sie Ihr Projekt betrachten, scheinen beide DLLs Multi-threaded Debug DLL (/ MDd) zu verwenden. Das bedeutet, dass beide MSVCP100D.dll verwenden. Das ist in Ordnung, das einzige Problem ist, dass die VC ++ - Version von qt von der QT-Website im RELEASE-Modus kompiliert wird und MSVCP100.DLL
verwendetIch empfehle Ihnen, Ihre Laufzeitbibliothek für Ihre DEBUG-Konfiguration in Multithreading-DLL (/ MD) zu ändern.
Meine zweite Empfehlung ist, dem Ratschlag von Rebert zu folgen und anstelle von std :: string char * zu verwenden. char * ist in jedem Fall kompatibel.
Sie können QT auch mit Multi-threaded Debug DLL (/ MDd) neu kompilieren und diese Version von QT für Ihre DEBUG-Konfiguration verwenden (aber das scheint zu viel Arbeit zu sein).
Nominell würde ich es nicht wagen, komplexe Daten (außerhalb meiner Kontrolle, codeweise) zwischen einer Anwendung und einer DLL zu übergeben. Ich würde nur POD-Strukturen übergeben, d. H. Ich würde die Schnittstelle stattdessen ändern:
%Vor%Macht das Leben viel einfacher;)
Tags und Links c++ qt dll visual-c++ abi