Seite 1 von 1

[gelöst] QLibrary und resolve()

Verfasst: 29. März 2011 15:31
von Willi2793
Hallo,

ich habe ein mir unerklärliches Phänomen bei dem ich falsches Handling definitiv nicht ausschliesse aber leider auch nicht weiter weiß.

Ich habe also eine DLL vorliegen welche ich per QLibrary einbinden möchte. Ich habe also folgendes Statement:

Code: Alles auswählen

QLibrary lib("library");
Wir Ihr ahnt heißt die DLL "library.dll". Ich habe dann auch die typedef'S für die Funktionen der DLL gemacht:

Code: Alles auswählen

typedef int  (*func1) (const char*);
typedef int  (*func2) (int);
typedef void (*func3) ();
und die resolves folgendermassen codiert:

Code: Alles auswählen

func1 twiFunc1 = (func1) lib.resolve("Function1");
func2 twiFunc2 = (func)2 lib.resolve("Function2");
func3 twiFunc3 = (func3) lib.resolve("Function3");
So weit, so gut. Das funktionietr auch alles und der Debugger zeigt ir danach auch an das die Funktionen alle korrekt geladen sind. Nun rufe ich sie auf. Einige funktionieren auch und bei anderen lande ich im Nirvana. Interessanterweise lande ich bei anderen Funktionen im Nirvana wenn ich vor den Resolves z.B. enen beliebigen qDebug() einbaue.

Ich vermute also das ich hier irgendwie etwas bei der Behandlung von QLibrary falsch mache oder vergessen habe. Aber ich sehe selebr kein Problem!?

Grüße,
Willi[/code]

Verfasst: 29. März 2011 15:36
von Christian81
Das ist eher ein C-Problem als Qt.
Wurde die Funktionen auch korrekt mit extern 'C' exportiert? Was sagt pexports wie die Funktionen heißen?

Verfasst: 29. März 2011 15:51
von Willi2793
Ja, die Funktionen wurden bei der Erstellung der DLL exported. Und pexports gibt mir unter EXPORTED auch genau die Namen aus die ich erwartet habe

Verfasst: 29. März 2011 16:44
von Christian81
Entlädst Du die Library wieder (== QLibrary Objekt wird zerstört) bzw. wurde es auch korrekt mit stdcall exportiert (hoffe stdcall ist das default unter windows)?

Verfasst: 29. März 2011 17:13
von Willi2793
Nein, die Library wird nicht zu früh entladen. Aber ich habe inzwischen was gefunden. Ich muss statt:

Code: Alles auswählen

typedef int  (*func1) (const char*);
dieses hier angeben:

Code: Alles auswählen

typedef int  (__stdcall *func1) (const char*);
Gefunden habe ich es hier:

http://www.qtcentre.org/threads/15722-U ... -arguments