muss leider etwas ausholen: Ich habe die Möglichkeit in einer bestimmten MFC-Anwendung selbst erstellte DLL's zu laden und diese zu nutzen. Diese Anwendung bietet ein Script-Interface in der man externe DLL's laden kann. Ich will über das Script-Interface bestimmte Daten einer DLL übermitteln. Die DLL soll diese dann über TCP an einem Server senden, der diese auswertet und über das Netzwerk die Ergebnisse zurücksendet (alles über TCP). Ich habe mit Qt5.4 die Netzwerkprogrammierung realisiert. Ganz easy und hauptsächlich mit QTcpSocket. Auch das Signal-Slot-Konzept wird genutzt. Diese Qt C++ Klasse funktioniert auch, habe mir dazu nur eine kleine Qt-Konsolenanwendung geschrieben um zu testen.
Mit dem QtCreater habe ich ein neues Projekt erstellt und als Shared-Lib deklariert. Er kompiliert auch und ich habe eine DLL. Jedoch kann die MFC-Anwendung (die ich erweitern will) die DLL nicht laden (weil es keinen Einstiegspunkt gibt). Der QtCreator hat einfach meine Klasse Client in eine DLL gepackt. Wie bekomme ich jetzt eine DLL mit dem Einsprungspunkt (vermutlich MainDLL)?
Hier nun einer meine zig Versuche die kleine Konsolenanwendung in eine DLL mit DllMain auszulagern:
Code: Alles auswählen
#include <QCoreApplication>
#include <qt_windows.h>
#include "client.h"
int main(int argc, char *argv[])
{
argc =0;
QCoreApplication MyApp(argc, NULL);
Client cl;
return MyApp.exec();
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)main, (LPVOID)hInstance, 0, NULL);
if (hThread != NULL)
break;
else
return FALSE;
}
}
return TRUE;
}
Jedoch lässt sich das nicht kompilieren. Ich bekomme folgende Ausgaben:
Hat jemand eine Ahnung was ich falsch mache, oder was ich übersehe bzw. vergesse? Der Compiler meckert originale Header-Dateien von Qt und MSVC an. Naja, habe leider keine Ahnung mit der Windows-Programmierung. Weiß auch gar nicht wo ich da anfangen soll. Schließlich will ich bei Qt bleiben, da es einfach genial ist! Eventuell erbarmt sich vielleicht jemand, der mir das mit den DLL's grob schildern kann. Bin auch bereit viel nachzulesen und mich irgendwo einzuarbeiten. Wenn ich nur wüsste, wie man mit der WinApi am besten anfängt. Für mich ist die WinApi komplett undurchsichtig. Habe dann versucht nur mal eine DLL mit MS-VC++ 2010 ohne Qt zu erzeugen. Aber sogar bei einem frischen DLL-Projekt blicke ich mit MSVC nicht wirklich durch, -erkenne einfach nicht den Zusammenhang...21:40:50: Führe Schritte für Projekt Client aus...
21:40:50: Unveränderte Konfiguration, qmake-Schritt wird übersprungen.
21:40:50: Starte "C:\Qt\Tools\QtCreator\bin\jom.exe"
C:\Qt\Tools\QtCreator\bin\jom.exe -f Makefile.Release
cl -c -nologo -Zm200 -Zc:wchar_t /Gz -O2 -MD -GR -W3 -w34100 -w34189 -EHsc -DUNICODE -DWIN32 -DCLIENT_LIBRARY -DQT_NO_DEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB -DNDEBUG -I"..\Client" -I"." -I"..\..\..\..\Qt\5.4\msvc2010_opengl\include" -I"..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtNetwork" -I"..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore" -I"release" -I"..\..\..\..\Qt\5.4\msvc2010_opengl\mkspecs\win32-msvc2010" -Forelease\ @C:\DOKUME~1\john\LOKALE~1\Temp\client.obj.1616.0.jom
client.cpp
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(120) : error C2373: '_InterlockedCompareExchange': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(214): Siehe Deklaration von '_InterlockedCompareExchange'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(121) : error C2373: '_InterlockedExchange': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(192): Siehe Deklaration von '_InterlockedExchange'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(122) : error C2373: '_InterlockedExchangeAdd': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(204): Siehe Deklaration von '_InterlockedExchangeAdd'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(131) : error C2373: '_InterlockedIncrement16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1103): Siehe Deklaration von '_InterlockedIncrement16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(132) : error C2373: '_InterlockedDecrement16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1104): Siehe Deklaration von '_InterlockedDecrement16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(133) : error C2373: '_InterlockedCompareExchange16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1105): Siehe Deklaration von '_InterlockedCompareExchange16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(134) : error C2373: '_InterlockedExchange16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(202): Siehe Deklaration von '_InterlockedExchange16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(135) : error C2373: '_InterlockedExchangeAdd16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(212): Siehe Deklaration von '_InterlockedExchangeAdd16'
main.cpp
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(120) : error C2373: '_InterlockedCompareExchange': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(214): Siehe Deklaration von '_InterlockedCompareExchange'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(121) : error C2373: '_InterlockedExchange': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(192): Siehe Deklaration von '_InterlockedExchange'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(122) : error C2373: '_InterlockedExchangeAdd': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(204): Siehe Deklaration von '_InterlockedExchangeAdd'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(131) : error C2373: '_InterlockedIncrement16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1103): Siehe Deklaration von '_InterlockedIncrement16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(132) : error C2373: '_InterlockedDecrement16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1104): Siehe Deklaration von '_InterlockedDecrement16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(133) : error C2373: '_InterlockedCompareExchange16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(1105): Siehe Deklaration von '_InterlockedCompareExchange16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(134) : error C2373: '_InterlockedExchange16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(202): Siehe Deklaration von '_InterlockedExchange16'
..\..\..\..\Qt\5.4\msvc2010_opengl\include\QtCore/qatomic_msvc.h(135) : error C2373: '_InterlockedExchangeAdd16': Neudefinition; unterschiedliche Modifizierer
C:\Programme\Microsoft Visual Studio 10.0\VC\INCLUDE\intrin.h(212): Siehe Deklaration von '_InterlockedExchangeAdd16'
..\Client\main.cpp(6) : warning C4007: 'main': '__cdecl' muss angegeben werden
Code wird generiert...
jom: C:\Dokumente und Einstellungen\john\Eigene Dateien\build-Client-Desktop_Qt_5_4_1_MSVC2010_OpenGL_32bit-Release\Makefile.Release [release\client.obj] Error 2
jom: C:\Dokumente und Einstellungen\john\Eigene Dateien\build-Client-Desktop_Qt_5_4_1_MSVC2010_OpenGL_32bit-Release\Makefile [release] Error 2
21:40:52: Der Prozess "C:\Qt\Tools\QtCreator\bin\jom.exe" wurde mit dem Rückgabewert 2 beendet.
Fehler beim Erstellen/Deployment des Projekts Client (Kit: Desktop Qt 5.4.1 MSVC2010 OpenGL 32bit)
Bei der Ausführung von Schritt "Make"
21:40:52: Verstrichene Zeit: 00:02.
Vielen Dank für jeglichen Hinweis!!
Viele Grüße, johno
PS.: oder wie bekommt man eine einfache kleine Qt-Konsolen-Anwendung in eine DLL die man dann in andere MFC-Anwendungen laden kann?
Edit: meine Qt-Klasse "Client" habe ich bereits exportiert mit: CLIENTSHARED_EXPORT
Das hat eigentlich alles der QtCreator schon gemacht auch folgende Header erstellt (die ich auch bei meiner Klasse includiert habe):
Code: Alles auswählen
#ifndef CLIENT_GLOBAL_H
#define CLIENT_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(CLIENT_LIBRARY)
# define CLIENTSHARED_EXPORT Q_DECL_EXPORT
#else
# define CLIENTSHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // CLIENT_GLOBAL_H