Überprüfen auf DLL existens in einem Directory
-
Eine kurze Frage :
wenn ich die DLL in der Art lade:HMODULE dllHandle; dllHandle = loadLibrary(L"MyDLL.dll"); if (dllHandle == NULL) { // DLL not exist } ...
soll ich auch:
FreeLibrary(dllHandle);
Was für eine Wirkung hat diese Funktion, wenn ich die vergesse?
Danke
-
Mit LoadLibrary wird die DLL geladen, deren Code im DLLMain ausgeführt und alle mit der DLL verbundenen DLLs auch geladen. Nur zum Testen ob die DLL da ist, ist das wohl Overkill.
Zum Prüfen ob diese Nutzbar ist OK.
Wenn Du FreeLibrary vergisst, wird die DLL im Adressraum belassen und DLLMain wird nicht erneut aufgerufen um etwaige Ressourcen freizugeben.
-
Hallo Martin,
danke für die Antwort.
Allerdings verstehe ich nicht was meinst du damit,:Martin Richter schrieb:
Nur zum Testen ob die DLL da ist, ist das wohl Overkill.
?
-
eigentlich das Laden der DLL wollte ich gar nichts.
Ich möchte einfach deren existenz prüfen.Fragen, die mir durch den Kopf gehen:
- was bewirkt, wenn ich der DLL mehrfach lade?
- wann muss ich den FreeLibrary einsetzen?
Danke
-
Zum Testen der Existenz: PathFileExists, Access, stat...
Wird eine DLL mehrfach geladen passiert eigentlich ncits außer, dass ein Zähler hochgezählt wird, oder DllMain für einen neuen Thread ausgeführt wird.
Für jeden Load bracuht es ein Free. Es gibt einen Referenzzähler.
Die DLL wird entladen wenn der Referenzzähler auf 0 fällt und diese DLL nicht zuvor implizit geladen wurde.
-
Hallo Martin und danke für deine Antwort.
Eine Frage habe ich noch.
Da in meine Anwendung um eine C_Wrapper sich handelt. Also habe ich keine Destruktur in dem ich
FreeLibrary("MYDLL")
aufrufen kann.
Soll ich villeicht eine Funktion zu aufraümen schreiben?Dieses Wrapper wird in LabVIEW gebraucht und möchte nicht, dass irgendwie auf eine Grund der Labview abstürzt.
-
Warum willst Du eine neue Funktion zum Aufräumen schreiben?
Mache es einfach so:HMODULE dllHandle; dllHandle = loadLibrary(L"MyDLL.dll"); if (dllHandle == NULL) { // DLL not exist } else { // DLL exists FreeLibrary(dllHandle); }
elegant wäre, wenn es zu einem Fehler kommt auf
GetLastError() == ERROR_FILE_NOT_FOUND
zu prüfen.
-
Gerhard_gast schrieb:
eigentlich das Laden der DLL wollte ich gar nichts.
Ich möchte einfach deren existenz prüfen.Ich bin kein Fan von "erst prüfen und dann machen". Ich mache normalerweise "machen und dann gucken ob's geklappt hat". Ist meist einfacher und vor allen "sicherer". Sicherer in dem Sinn, dass es oft schwer ist eine vollständige Prüfung durchzuführen ohne wirklich "zu machen". Und vor allem kann sich zwischen der Prüfung und dem "machen" auch alles ändern - z.B. Files können gelöscht werden etc.
Wenn man einfach macht, dann hat man nachher entweder erfolgreich und vollständig gemacht, oder eben nicht. Und wenn man beim Programmieren nicht geschludert hat, dann weiss man nachher auch welches von beiden. Und falls was schief gegangen hat meist auch genau was und oft auch warum (Fehlercodes etc.).
Gerhard_gast schrieb:
- wann muss ich den FreeLibrary einsetzen?
FreeLibrary
musst du gar nicht unbedingt aufrufen.
Kommt auf die Anwendung drauf an, gibt natürlich Fälle wo es nötig ist. I.A. ist es aber nicht nötig, und die DLL nicht zu entladen ist auch wieder die sicherere Variante.
Die DLL zu früh zu entladen kann nämlich auch wieder zu Problemen führen. z.B. wenn die DLL noch Threads/Timer/asynchrone IOs laufen/ausständig hat. Oder auch wenn noch irgend ein Programmteil auf statische Daten (globale Variablen, Literals, ...) der DLL zugreift nachdem sie entladen wurde.
(Oder auch auf dynamisch angeforderten Speicher, der aber in derDllMain
freigegeben wurden.)Davon abgesehen ist die Frage wann du die DLL entladen kannst einfach zu beantworten: "wenn du mit ihr fertig bist".
ps: Wenn du wirklich prüfen willst ob ein File existiert, dann kannst du dazu schön
GetFileAttributes
verwenden. Falls es das File nicht gibt kommtINVALID_FILE_ATTRIBUTES
zurück, undGetLastError
liefert danach einen entsprechenden Fehlercode (vermutlichERROR_FILE_NOT_FOUND
wenn der Pfad gültig ist, man alle nötigen Berechtigungen hätte aber einfach kein File mit dem Namen existiert).
-
Hallo,
wenn ich die Funktion "FreeLibrary(dllHandle)" wie es hier unten geschrieben:
HMODULE dllHandle; dllHandle = loadLibrary(L"MyDLL.dll"); if (dllHandle == NULL) { // DLL not exist } else { // DLL exists FreeLibrary(dllHandle); }
stürze das Labview.
-
Aha. Soso. Sehr interessant.
-
Eine schlecht programmierte Komponente würde ich mal sagen...