Qt DLL für nicht Qt Anwendung

Alles rund um die Programmierung mit Qt
Antworten
kellerkind018
Beiträge: 14
Registriert: 11. Juni 2006 21:18
Kontaktdaten:

Qt DLL für nicht Qt Anwendung

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

QApplication wird für viele interne Dinge (Signals/Slots,QSocket,Eventloop allg., ...) gebraucht - also nein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
isifloh
Beiträge: 37
Registriert: 31. August 2006 09:40

Beitrag 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;
}
}
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Sobald die Applikation, welche die DLL aufruft ne Eventloop aufmacht ists vorbei.

@isifloh: und bitte benutze die [

Code: Alles auswählen

]-Tags !
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten