HInstance Fehler, mehrfaches Aufrufen von Loadlibrary(implib.dll)
-
Hallo Leute,
ich habe ein Problem, das ich auf eigene Faust nicht mehr lösen kann und auch nicht den Fehler sehe. Im Code sieht man wie Funktionen aus einer geladenen DLL mit GetProcAddress extrahiert werden.
Bei einmaligen Aufrufen des abgebildeten Codes ist das kein Problem. Aber rufe ich den Code mehrfach auf, so wird beim 2. Aufruf der Loadlibrary- Funktion der Wert für "hDLLimp = 0x00000000 | unused = ???" gesetzt. Die Folge daraus ist natürlich, dass ich keinerlei Funktionen aus der DLL mit GetProcAddress herauslesen kann, da der handle nicht gültig ist. Woran liegt das. Laut MSDN wird mit dem Aufruf von:
FreeLibrary(hDLLimp);
mein Handle und alle geladenen Funktionen und die DLL entladen.Was mache ich falsch?
{ HINSTANCE hDLLimp; GETCOUNTS fncgetcounts; GETITEM fncgetitem; IMPEXPINTERFACE fncimportinterface, fncexportinterface; TProcLib *proclib; char filepath[_MAX_PATH]; hDLLimp = LoadLibrary(TEXT("implib.dll")); fncgetcounts = (GETCOUNTS) GetProcAddress(hDLLimp, "GetCounts"); fncgetitem = (GETITEM) GetProcAddress(hDLLimp, "GetItem"); fncimportinterface = (IMPEXPINTERFACE) GetProcAddress(hDLLimp, "ImportInterface"); funktionen (.....); FreeLibrary(hDLLimp); }
Wahrscheinlich ist es eine Banalität und ich habe in der Dokumentation irgendwo was überlesen oder die Anschauung der ganzen Sache ist verkehrt.
-
Meine Kristallkugel ist seit Jahren in Reparatur.
Was sagt GetLastError?
-
GetLastError liefert mir eine "126" zurück, wonach das Modul nicht mehr existent ist.Hmmmm, aber ich initialisiere es doch wiederholt beim Aufruf des abgebildeten Codes
ERROR_MOD_NOT_FOUND
126 (0x7E)The specified module could not be found.
-------------------------------------------------
Lasse ich hingegen den FreeLibrary Befehl weg, so kann ich den Code wiederholt aufrufen. Ist das aber Sinn der Sache?
Denn...
Ein weiteres Problem ist, dass eine weitere DLL nach dem selben Schema geladen werden soll, die vom Aufbau ähnlich ist. Lasse ich nun FreeLibrary im Aufruf der ersten DLL weg, so kann ich die zweite DLL nicht mehr einladen, da der Handle der 2. Dll "hDLLexp" wie im ersten Post beschrieben von Loadlibrary zu 0 gesetzt wird.{ DWORD Error; GETCOUNTS fncgetcounts; GETITEM fncgetitem; IMPEXPINTERFACE fncexportinterface; TProcLib *proclib; char filepath[_MAX_PATH]; HINSTANCE hDLLexp = LoadLibrary(TEXT("explib.dll")); Error = GetLastError(); fncgetcounts = (GETCOUNTS) GetProcAddress(hDLLexp, "GetCounts"); fncgetitem = (GETITEM) GetProcAddress(hDLLexp, "GetItem"); fncexportinterface = (IMPEXPINTERFACE) GetProcAddress(hDLLexp, "ExportInterface"); Funktionen (.....); FreeLibrary(hDLLexp); }
-
Was soll denn "implib.dll" sein? Das hast Du doch 1-zu-1 aus einem Beispiel rauskopiert.... verwende den "richtigen" Namen und schon geht es
-
Die implib.dll ist dafür da um Oberflächeninformationen eines Rauheitsprofils einzulesen. Die Datei liegt mir auch vor, sowie die explib.dll, die zum Abspeichern von gleichen verantwortlich ist.
Mein Problem ist nach wie vor die Syntax mit HInstance, LoadLibrary & FreeLibrary und das Laden von verschiedenen DLLs.
-
Dexterus schrieb:
Bei einmaligen Aufrufen des abgebildeten Codes ist das kein
Problem. Aber rufe ich den Code mehrfach auf, so wird beim 2. Aufruf der
Loadlibrary- Funktion der Wert für "hDLLimp = 0x00000000 | unused = ???"
gesetzt.Dexterus schrieb:
GetLastError liefert mir eine "126" zurück, wonach das Modul
nicht mehr existent ist.Hmmmm, aber ich initialisiere es doch wiederholt beim
Aufruf des abgebildeten CodesERROR_MOD_NOT_FOUND
126 (0x7E)
The specified module could not be found.-------------------------------------------------
Lasse ich hingegen den FreeLibrary Befehl weg, so kann ich den Code wiederholt
aufrufen.Prinzipiell kann man natürlich beide DLLs gleichzeitig laden, wenn man es
vermeidet gleiche Variablennamen zu verwenden ...Die Fehlermeldung besagt jedoch, das die DLL nicht mehr gefunden wird. Das
könnte natürlich an dem (nicht vorhandenen) Pfad liegen.Wo liegt also die DLL eigentlich genau ?
-
Hallo,
also das Problem ist gelöst worden. Es lag an der nicht vollständigen Pfadangabe für die DLL. Die DLLs selbst lagen/liegen nach wie vor im Projektordner.
Der Fehler tritt unter anderem nur im Debug-Modus auf. Da im Release Ordner die DLLs vorhanden sind und auch trotz unvollständigem Pfad immer wieder geladen werden können.
Möglicherweise hatten die exportierten Funktionen und
FreeLibrary
Einfluss auf den aktuellen Prozessordner. Ich weiß es nicht.
Fazit ist, wer ähnliche Probleme hat, kann diese mit vollständiger Pfadangabe umgehen.