Seite 1 von 1

Qt DLL für nicht Qt Anwendung

Verfasst: 14. Juni 2008 22:19
von kellerkind018
Nabend zusammen.

Kann mir jemand sagen, ob und wie es möglich ist, eine DLL mit Qt zu entwickeln, welche von einem nicht Qt Programm aufgerufen wird?

Problem ist nämlich, dass ich momentan immer die Meldung erhalte, dass mir ein QApplication fehlt, wenn ich ein Widget in der DLL erzeuge. Natürlich gibt es kein QApplication Objekt, weil die Hauptanwendung ja keine Qt Anwendung ist. Ein QApplication in der DLL zu erzeugen würde aber bedeuten, dass ich diese auch mit qapp.exec() ausführen müsste und dann nicht mehr zur eigentlichen Hauptanwendung zurückgekehrt wird.

Von Trolltech gibt es das Addon MFC to Qt Migration aber jedoch lediglich für kommerzielle Anwendungen.

Gibt es eine andere Lösung? Beispielsweise Prozesskummunikation?

Vielen Dank und nen schönes Wochenende!

Thomas

Verfasst: 14. Juni 2008 22:39
von Christian81
QApplication wird für viele interne Dinge (Signals/Slots,QSocket,Eventloop allg., ...) gebraucht - also nein.

Verfasst: 15. Juni 2008 21:43
von isifloh
hallo

es geht und zwar folgendermassen:

hier mal ein kleiner auszug aus meinem code.
Plotter ist eine von QDialog abgeleitete klasse.

#include <QtGui>
#include <windows.h>

QApplication *app;
extern "C" {
BOOL __declspec( dllexport ) WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) {
if (fdwReason==DLL_PROCESS_ATTACH) {
int argc;
argc=0;
char **argv=NULL;
app=new QApplication(argc,argv);
pid=-1;
}
if (fdwReason==DLL_PROCESS_DETACH) {
delete app;
app=NULL;

return TRUE;

}
return TRUE;
}
void __declspec( dllexport ) CALLBACK init(int mp) {
pl=new Plotter(mp);
mmp=mp;
}
}

Verfasst: 15. Juni 2008 21:46
von Christian81
Sobald die Applikation, welche die DLL aufruft ne Eventloop aufmacht ists vorbei.

@isifloh: und bitte benutze die [

Code: Alles auswählen

]-Tags !

Verfasst: 16. Juni 2008 13:57
von RHBaum
Es geht definitiv.

Wir schreiben hier plugins, die ne eigene oberflaeche haben, fuer die eigenschaften und so ...

Die schnittstelle ist 100% QT frei ...

beim aufruf wird einfach ein fensterhandle (HWINDOW) uebergeben ...

So kompliziert wie oben mit schnittstelle muss es auch gar ned sein ...

richtig ist, das ding braucht ein qApplication object fuer die eventloop. das kann man aber in der Main der Dll erzeugen ....

Damit funktioniert sogar , wenn die QT in der MainApp(exe) ne andere Version hat als die QT version der Dll ...

Was man zu braucht ist halt das winmigration kit (wir verwenden QMFCApp, statt QApplication in den Dll's) .... oder man baut sichs nach, so kompliziert isses auch ned :-)
Mit QWinWidget kann man das window handle quasi uebernehmen, und das QWinwidget dem neuen dialog als Parent "verkaufen" ...
Damit ist der Dialog wirklich auch modal zur aufrufenden application ...

Wir ham hier auch nen Loesung am laufen, wo ich auss ner Anwendung ueber nen plugin in nen vorhandenes Fenster zeichnen lasse, inklusive controls Treeview und so.
Ein plugin verwendet da auch die QT .... iss aber bissi mehr aufwand, weil man haendisch paar QT events auf windows nachrichten umsetzen muss und zurueck ... allein um groessenanederungen aus der app mitzubekommen etc.
Aber auch das funktioniert ....

Ciao ...