Erstellen einer DLL in VS2012 mit Qt

12/31/2013 00:12 Doktor.#1
Hey,
hab jetzt schon alles versucht was mir Google, bei meinen googlen-Künsten ausspuckte, aber irgendwie komme ich einfach nicht genau dahinter wie ich nun eine DLL erstelle die ganz normal wie meine .exe eine GUI erscheinen lässt.

Nach meinem letzten Versuch einfach alles in einer normalen VS erstellten DLL Projekt zu includen und zu benutzen und natürlich fehlschlug :rolleyes: frag ich mal hier.

_
Wie erstelle ich jetzt genau eine DLL in VS2012, so das ich Qt vollkommen nutzen kann?

Mfg. ~Wystan

Ps: War mir nich sicher ob ich das nun hier oder im C++ Bereich posten sollte, aber hier sollte es hoffentlich auch hinpassen. :b
01/01/2014 16:30 Doktor.#2
Niemand eine Ahnung?
01/02/2014 12:45 MrDami123#3
Laut meinen hier vorliegenden C# Buch, kann man mit dem Visual Studio sogenannte "Windows-Steuerelemente" erstellen.
Quote:
Das Ergebnis der Kompelierung ist wie bei der Klassenbibliothek eine DLL-Datei. Im Gegensatz zu einer Klassenbibliothek hat ein Steuerelement jedoch eine visuelle Oberfläche.
Vielleicht hilft dir das weiter.
01/03/2014 00:49 Doktor.#4
Danke, aber ich wollte Qt in einer Dll benutzen können und nicht die "Windows-Steuerelemente", dennoch danke. :)
01/03/2014 13:10 tolio#5
hab noch nie was mit cpp in diesem kontext zutun gehabt, warum nicht ca so: binde alle benötigten sachen irgendwo in der ddl ein und dann erstellste halt die form und zeigst sie an. Sollte eigendlich in den meisten sprachen und frameworks so klappen.

pseudocode:
void main()
{
form frm = new form();
frm.size = xy;
frm.show();
}
01/03/2014 13:44 snow#6
^das Problem scheint nicht die Verwendung sondern eher die Implementierung der Bibliotheken zu sein.

@TE: Die Files hast du hier: [Only registered and activated users can see links. Click Here To Register...] für VS12 geladen? Und das Plugin für VS12? [Only registered and activated users can see links. Click Here To Register...]
Was ist denn fehlgeschlagen bei deinem ersten Versuch? Evtl. war es ja was triviales..
01/04/2014 05:26 Doktor.#7
Code:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
        QWidget *w = new QWidget;
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		DisableThreadLibraryCalls(hModule);
                w->setGeometry(100,100,100,100);
                w->show();
		break;
	}
	return TRUE;
}
Ganz normal halt, alles incuded etc. aber wenn ich die dll injecte kommt kein Fenster.
Bei anderen Versuchen ist sogar der ganze Client geschlossen wurden.

Hab im Web dann noch etwas von QApplication gelesen, die auch bei einer normalen .exe ausgeführt wird, also versuchte ich dies in der dll.
Code:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
        QApplication app;
        QWidget *w = new QWidget;
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		DisableThreadLibraryCalls(hModule);
                w->setGeometry(100,100,100,100);
                w->show();
		break;
	}
	return app.exec();
}
kommt aber zum Fehler, da die Parameter fehlen, in einem .exe Projekt wäre ja die main mit den Parameter argc und argv, die aber in der dll nicht existieren, bzw. einfaches hinzufügen von argv und argc funktionierten nicht.

Hier nochmal wie es normal in einer main aussieht:
Code:
int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	QWidget w;
	w.show();
	return a.exec();
}
01/04/2014 06:14 snow#8
Ah, so meinst du das.
Versuch mal, das ganze so aufzubauen:

Code:
DWORD WINAPI QTThread(LPVOID param)
{
	QApplication app(__argc, __argv);
	QWidget w;
	w.setGeometry(100, 100, 100, 100);
	w.show();

	return app.exec();
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(nullptr, 0, QTThread, nullptr, 0, nullptr);
		DisableThreadLibraryCalls(hModule);
		break;
	}
	return TRUE;
}
__argc und __argv sind von VS bereitgestellt, ansonsten gibt es noch die WinAPI Funktion CommandLineToArgvW, die funktioniert allerdings nur mit Unicode Strings, da müsstest du also noch was zum Konvertieren der Chars schreiben.
So wie deine DllMain bisher aufgebaut war, wurden pro Sekunde jede Menge QWidgets auf dem Heap allokiert, mit dem CreateThread im DLL_PROCESS_ATTACH case sollte das ganze nur einmal in einem neuen Thread aufgerufen werden. :)
01/04/2014 06:20 Doktor.#9
Danke!
Funktioniert bestens. :)