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
Qt DLL für nicht Qt Anwendung
-
kellerkind018
- Beiträge: 14
- Registriert: 11. Juni 2006 21:18
- Kontaktdaten:
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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;
}
}
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;
}
}
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Sobald die Applikation, welche die DLL aufruft ne Eventloop aufmacht ists vorbei.
@isifloh: und bitte benutze die [
@isifloh: und bitte benutze die [
Code: Alles auswählen
]-Tags !MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
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 ...
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 ...