Seite 1 von 1

QLibrary seltsames Verhalten

Verfasst: 16. Oktober 2012 15:21
von dazedly
Unter Windows habe ich die ganze Zeit mit LoadLibrary eine DLL zur Laufzeit geladen. Die hat auch richtig funktioniert. Jetzt wollte ich QLibrary benutzen, was auch unter Linux richtig funktioniert, aber unter Windows stürzt es bei QLibrary::resolve("symbolname") mit access violation ab. Eigentlich sollte mir diese Funktion doch einen Nullpointer zurück liefern, wenn es eben nicht geladen werden konnte.

Alter funktionierender Code:

Code: Alles auswählen

 typedef CHAR (__stdcall *CTINIT)(USHORT,USHORT); 
	 	 
	 	    LPCSTR    szCT_init = "CT_init"; 
	 	    HMODULE   hCtapiLib = 0x0; 
	 	    CTINIT    CT_init = NULL; 
	 	 
	 	    hCtapiLib = LoadLibrary("ctcym.dll"); 
	 	 
	 	    if(hCtapiLib == NULL) 
	 	     { 
	 	       cout << "Couldn't load ctcym.dll!!!" << endl; 
	 	     } 
	 	     else 
	 	     { 
	 	       cout << "SUCCESS: ctcym.dll loaded!!!"<<endl; 
	 	     } 
	 	        cout << "test1" << endl; 
	 	    CT_init = (CTINIT)(GetProcAddress(hCtapiLib,szCT_init)); 
Neuer Code:

Code: Alles auswählen

this->ctLib = new QLibrary("C:/Windows/system32/ctcym.dll");
qDebug() <<  this->ctLib->fileName() <<  this->ctLib->load() << this->ctLib->isLoaded()<< this->ctLib->errorString();
	
	if(!this->ctLib->resolve("CT_init")) // hier stürzt er schon ab!
	{
		qDebug() << "cant resolve symbol!!";
	}
	typedef char (*CTINIT)(unsigned int,unsigned int);
	CTINIT CT_init = (CTINIT) this->ctLib->resolve("CT_init");

Unter Linux funktioniert mein Code.

EDIT:

this->ctLib ist ein QLibrary Pointer als Klassenmember

Re: QLibrary seltsames Verhalten

Verfasst: 18. Oktober 2012 13:40
von franzf
Genaue Fehlermeldung, bitte. Hast du dir schon mit dem Debugger nen backtrace geben lassen?
Woher weißt du denn, dass es genau an der Stelle passiert?
Warum sind die CT_init-Parameter in der QLibrary-Version plötzlich unsigned int und nicht mehr unsigned char?

Re: QLibrary seltsames Verhalten

Verfasst: 18. Oktober 2012 14:11
von dazedly
Ich weiß das, da ich das Ganze mit qDebug eingegrenzt habe. Das Problem besteht ist, dass QLibrary::isLoaded() nie true ist. Das mit den Unterschiedlichen Parametern ist schon geändert, aber nicht Teil des Problems. Der MSVC Debugger spuckt leider auch nichts brauchbares aus. Mein Problem ist jetzt eigentlich "nur", dass QLibrary die DLL nicht lädt.

Re: QLibrary seltsames Verhalten

Verfasst: 19. Oktober 2012 21:35
von franzf
aber unter Windows stürzt es bei QLibrary::resolve("symbolname") mit access violation ab
Das Problem besteht ist, dass QLibrary::isLoaded() nie true ist
Bitte... es sollte klar sein, dass wenn die lib nicht geladen werden kann, irgend etwas böses passiert. Dass isLoaded() nie true wird hast du im ersten Post nicht erwähnt. DAS IST ABER WICHTIG! Durch die qDebug()-Zeile hab ich vielmehr angenommen dass gerade das Laden funktioniert hat!
Was gibt denn errorString() aus?

Re: QLibrary seltsames Verhalten

Verfasst: 21. Oktober 2012 22:19
von dazedly
Mehr als Unknown Error bekomme ich nicht :(