dll wird nicht schnell genug freigegeben
-
Hallo jungs,
ich habe folgendes problem:
kurz bevor ich ein programm beende (also quasi... ganz ganz kurz davor [bei WM_DESTROY]), soll noch eine funktion aus einer dll ausgeführt werden. das funktioniert soweit auch, nur schafft windows es dann nicht mehr schnell genug die dll mittels FreeLibrary(...); zu entladen.
im moment löse ich das problem, indem ich nach dem letzten funktionsaufruf noch ein Sleep(1500); laufen lasse und dann erst SendMessage(WM_DESTROY,...); schicke....besser wäre aber, wenn ich das ausführen der funktion (aus der dll) und das entladen der dll vor dem beenden des programms machen könnte...
(das programm soll die funktion mit dem beenden des programms ausführen... dann ist es aber schon tot, und kann die dll nicht mehr entladen (bzw. löschen)
Weiß jemand Rat???
-
floppy schrieb:
nur schafft windows es dann nicht mehr schnell genug die dll mittels FreeLibrary(...); zu entladen.
woher weisst du das windows die dll nicht frei gibt...?
was gibt FreeLibrary () an ruckgabewert zurueck ?
-
FreeLibrary gibt "nonzero" zurück...
und mit Sleep(2000); gehts ja... deswegen denke ich, dass der einfach zeit braucht, zwischen funktionsaufruf und entladen (der dll)
-
bin mir jetzt super sicher, dass es daran liegt! die dll wird einfach nicht schnell genug entladen!
ich lasse mir per MessageBox ausgeben, dass FreeLibrary net geklappt hat... warte etwas... klicke auf okay. dann führt der Freelibrary nochmal aus. und siehe da... es funzt (wenn ich mir etwas zeit lasse, bevor ich auf OKAY klicke)
-
was nicht heißt, dass ich mich damit zufrieden gebe
also ich suche immernoch nach einer lösung
-
floppy schrieb:
FreeLibrary gibt "nonzero" zurück...
Aus dem Platform SDK zu FreeLibrary:
Return Values
If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, call GetLastError.
Vielleicht hast "succeed" und "fail" verwechselt? Wenn der Rückgabewert "nonzero" ist, hat der Aufruf nämlich geklappt.
Ansonsten: Was sagt GetLastError?
-
... und wenn du dann nochmal versuchst die DLL freizugeben klappt's natürlich nicht mehr
-
eine Möglichkeit wäre auch Deine Funktion in der DLL-Routine
DllEntryPoint (HANDLE hInst, DWORD Reason, LPVOID PV)
bei Reason == DLL_PROCESS_DETACH
auzurufen. Das ist normal die Stelle um irgenwelche Auräumarbeiten z.B. Speicherfreigabe etc. durchzuführen.
-
okay stimmt... also hat Freelibrary wohl gefunzt, aber trotzdem löscht der die dll nur, wenn ich vorher das Sleep(2000); einbaue...
-
FreeLibrary gibt "nonzero" zurück...
und mit Sleep(2000); gehts ja...So wie sich das anhört, geht es ja immer - und warum nimmst du nicht Ulis Variante?!