QT Form in WIN32 DLL

10/12/2013 18:40 BrendonHomo#1
hallo,

weiß wer wie ich die QT form richtig in einer win32 .dll aufrufe?
QT ist bereits eingebunden etc. ich erstelle ein thread in der dll main und rufe im thread Dialog.show() auf, leider hängt sich das Spiel auf (art endlos loop).

ich glaube es liegt daran, das ich 'ne eigene "Prozessschleife" für die gui erstellen muss?

weiß wer rat wie man das richtig angeht?
10/13/2013 01:47 Padmak#2
Du musst für die UI einen eigenen Thread erstellen, entweder über _beginthread(ex), über boost::thread, std::thread, ...
Muss halt parallel zur Hauptschleife ablaufen

Padmak
10/13/2013 10:13 MrSm!th#3
Er erstellt schon einen Thread.
10/13/2013 10:41 Schlüsselbein#4
In welchem Thread wird app.exec() gecalled?
10/13/2013 11:06 BrendonHomo#5
vorhin mit std::thread gab es eine Art endlosschleife (nach aufruf der .detach() Funktion), nun habe ich es auf CreateThread umgeschrieben, allerdings wird mir Prozess direkt terminiert sobald ich die .dll in den Prozess jage.

Code:
DWORD WINAPI ShowDialog(LPVOID lpvReserved)
{
	FormMain form;
	form.show();
	return QApplication::exec();
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
	if(fdwReason == DLL_PROCESS_ATTACH)
	{
		HANDLE hThread = CreateThread(NULL, 0, &ShowDialog, NULL, 0, 0);
		CloseHandle(hThread);
	}

	return TRUE;
}
10/13/2013 12:38 Schlüsselbein#6
Nimm olly oder n anderem Debugger und schau nach an welchem Punkt deine Anwendung crasht.

Btw: Die Qt dlls befinden sich im gleichen Ordner?
10/13/2013 12:40 Dr. Coxxy#7
nimm _beginthread und net createthread.
10/13/2013 12:52 Schlüsselbein#8
Bzw _beginthreadex, bei welchem die Signatur afaik identisch ist.
10/13/2013 13:20 BrendonHomo#9
Quote:
Originally Posted by Schlüsselbein View Post
Nimm olly oder n anderem Debugger und schau nach an welchem Punkt deine Anwendung crasht.

Btw: Die Qt dlls befinden sich im gleichen Ordner?
die dlls befinden sich natürlich im gleichen ordner.
ich habe es mir gerade mal in olly angeschaut, scheinbar wird mir eine exception geworfen:

"QWidget: Must construct a QApplication before a QPaintDevice"

habe mal etwas gegoogled, allerdings keine funktionierende lösung gefunden.

Quote:
Originally Posted by Dr. Coxxy View Post
nimm _beginthread und net createthread.
Quote:
Originally Posted by Schlüsselbein View Post
Bzw _beginthreadex, bei welchem die Signatur afaik identisch ist.
_beginthreadex selbiges Problem :|


meine FormMain klasse:

.cpp


.h

Ahja, mir fehlt im Header in der Klasse FormMain das makro Q_OBJECT damit ich Signale / Slots verwenden kann, allerdings kriege ich dort 3 linker error:

Quote:
1>FormMain.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall FormMain::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@FormMain@@UAEHW4Call@QMetaObject@@HP APAX@Z)".
1>FormMain.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall FormMain::qt_metacast(char const *)" (?qt_metacast@FormMain@@UAEPAXPBD@Z)".
1>FormMain.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall FormMain::metaObject(void)const " (?metaObject@FormMain@@UBEPBUQMetaObject@@XZ)".
weiß jemand evtl wie ich das auch behoben bekomme? bei mir läuft qt mit dem vs plugin in vs 2012.
das projekt bereinigen und neu kompilieren klappt da auch nicht.
bei einer normalen qt Anwendung meckert er nicht.
10/13/2013 13:38 Schlüsselbein#10
Der Fehler ist doch recht eindeutig?! Erstellt halt mal als erstes ein QApplication Objekt und rufe dann exec von diesem auf nachdem du deine Widgets erstellt hast.
10/13/2013 13:44 BrendonHomo#11
Quote:
Originally Posted by Schlüsselbein View Post
Der Fehler ist doch recht eindeutig?! Erstellt halt mal als erstes ein QApplication Objekt und rufe dann exec von diesem auf nachdem du deine Widgets erstellt hast.
du hast recht, jetzt klappt alles einwandfrei. danke!
davor habe ich es bereits mit einem selbst erstellten QApplication obj versucht, allerdings schmierte der Client wieder ab, wovon ich ausging das es das alte Problem war.
habe es mir gerade nochmal im Debugger dann angesehen und er schmiss mir diesmal doch eine andere exception :

"Failed to load platform plugin "windows"."

nachdem ich jetzt noch die libEGL.dll in den Ordner kopiert habe funktioniert es einwandfrei.

jetzt währe noch die frage wie ich die moc linker Errors behebe, laut Google soll ich das projekt einfach bereinigen und neu erstellen, was bei mir aber das Problem nicht behoben hat.


Problem solved, die moc.cpp vergessen hinzuzufügen. kann ngeschlossen werden.