DLLs (Qt)

Aus C++_PHP_und_mehr
Wechseln zu: Navigation, Suche

Erstellen einer DLL

mit Qt Creator

Datei->Neu... → Vorlage:Anderes Projekt → C++-Bibliothek → Auswählen... →
Typ: Dynamisch gebunden, Name: DLL-Name, Erzeugen in: Projektordner → Weiter →
Ankreuzen Desktop[1] → Weiter
Ankreuzen QtCore[2] → Weiter →
Eingeben der 1. Klasse des Projektes → Klassenname: MeineKlasse → Weiter →
Abschließen

Es wird Grundstock für eine DLL angelegt mit den Dateien DLL-Name.pro, MeineKlasse.cpp, MeineKlasse.h und MeineKlasse_global.h.

Öffentliche Symbole der DLL[QtR 1]

müssen in der DLL mit Q_DECL_EXPORT und bei der Verwendung mit Q_DECL_IMPORT[3] gekennzeichnet werden.

Am einfachsten geht das mit einer Präprozessorverzweigung:
#if defined(MYDLL_LIBRARY)
#  define MYDLL_SHARED_EXPORT Q_DECL_EXPORT
#else
#  define MYDLL_SHARED_EXPORT Q_DECL_IMPORT
#endif

Jedes öffentliche Symbol im DLL-Source wird dann mit MYDLL_SHARED_EXPORT gekennzeichnet. Wenn dann im Projektfile der DLL DEFINES += MYDLL_LIBRARY hinzufügt, wird jedes öffentliche Symbol mit Q_DECL_EXPORT gekennzeichnet.

Einbinden mit QLibrary[QtR 2]

QLibrary importiert C-Objekte, die Funktionen müssen[4] in der DLL mit extern "C" deklariert werden.

Wenn die DLL mit QtCreator (oder MinGW ?) erzeugt wird, wird für Funktionen mit _stdcall[5] in der DLL an den Funktionsnamen ein @n angefügt, wobei n anscheinend der Anzahl der Bytes der Parameter entspricht, mindestens 4 pro Parameter[6]. Beispiel:

extern "C" MYDLL_SHARED_EXPORT void _stdcall Out32(short adr, short data);


ist von der Applikation unter Funktionsname "Out32@8" erreichbar:

{
	typedef void _stdcall (*ParOutType)(short adr, short data);
	ParOutType ParOut;
	QLibrary parLib("Lib.dll");
	if (!parLib.load()) { qDebug() << "Lib not loaded"; }
	else ParOut = (ParOutType)parLib.resolve("Out32@8");
}


Fußnoten

  1. Unter Details kann ein Ordner für die DLL, jeweils debug und release, angegeben werden. ShadowBuild führt zu einem eigenem Pfad für die Zieldateien (zB. die DLLs), falls nicht angekreuzt, werden alle Dateien in den Projektordner (mit den Quelldateien) geschrieben. Die Vorgabe legt für Debug und Release unterschiedliche Pfade an, dies ist nicht notwendig, da in jeden Zielpfad Ordner "debug" und "release" angelegt werden.
  2. Voreinstellung, weitere Module bei Bedarf, nicht ausprobiert.
  3. Zumindest mit QLibrary scheint kein Q_DECL_IMPORT notwendig zu sein.
  4. bei Verwendung eines C++-Compilers wie MinGW
  5. um mit Visual-C++ kompatibel zu sein
  6. Der Name steht als Klartext in der DLL, man kann ihn mit einem Texteditor finden und überprüfen

Quellen

  • aus der Qt Reference Documentation 4.7
  1. Creating shared Libraries
  2. QLibrary Class Reference