Überprüfen auf DLL existens in einem Directory

Gast #4314171
Lesenswert?

Hallo Zusammen:


Programmiersprache: C++
Anwendung: WinAPI

Problematik:
Dynamische loopen, ob die DLLs (in Application Directory) existieren?

meine Vorgehen kurz beschrieben:

wenn ich die DLL in der Art lade:
1
HMODULE dllHandle;
2
dllHandle = loadLibrary(L"MyDLL.dll");
3
if (dllHandle == NULL)
4
{
5
 // DLL not exist
6
}
7
...
soll ich auch:
1
FreeLibrary(dllHandle);

Ich muss eigentlich DLLs gar nicht laden, da sie automatische geladen 
werden.
Ich muss eigentlich nur prüfen, ob die DLLs existieren.

Wenn ich einen DLL unnötig 2 mal lade, was wirkt das?
Soll ich nach jedem laden FreeLibrary aufrufe und was wirkt das auf die 
Stabilität der SW wenn ich das nicht tue?
#4314184
Lesenswert?

Ist die WinAPI Hilfe defekt ?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx

LoadLibrary tut haufenweise mehr, als bloss festzustellen, ob die Lib da 
ist. Die lädt eventuell weitere von ihre referenzierte Libs (es kann ja 
auch wünschenswert sein, zu erfahren, ob ALLE da sind), rechnet alle 
Adressen um, Ruft DllMain auf.

Das alles kann man steuern, mit 
https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx

Die hat gegenüber access oder fopen den Vorteil, auch den Systemsuchpfad 
zu verwenden, von dem man nie so genau weiss, was je nach 
Betrübssystemversion alles dazugehört.

Wenn ein LoadLibrary erfolgreich war, muss NATÜRLICH auch ein 
FreeLibrary erfolgen,. Wenn das LoadLibrary NICHT erfolgreich war, gibt 
es eine üble MessageBox. Dagegen hilft SetErrorMode.
Persönliche Seite #4314332
Lesenswert?

Gerhard_Berlin schrieb:
> Ich muss eigentlich DLLs gar nicht laden, da sie automatische geladen
> werden.

Wenn sie automatisch geladen werden, musst Du nicht prüfen, ob sie 
existieren. Tun sie das nämlich nicht, kann Dein Programm nicht 
gestartet werden und Windows gibt eine entsprechende Fehlermeldung aus. 
Also kannst Du, sobald dein Programm läuft, sicher davon ausgehen, daß 
die DLLs vorhanden sind.
Gast #4314445
Lesenswert?

Ja ihr habt recht.
Ich muss die DLLs gar nicht laden.

Es handelt sich eigentlich um eine C_Wrapper, die für eine C++ DLL 
geschrieben wurde (Labview Interface).

Dieses C_Wrapper wird mit der entsprechenden DLL in LabVIEW importiert.
Dieses DLL hängt auch von andere DLLs zusammen ab.


Alle DLLs müssen in eine bestimmten Directory (wo die Labview.exe 
existiert)sein sonst tritt eine Fehler ein. Dieses Fehler könnte nicht 
von der user spezifiziert werden.

Das ist der Grund: Warum in die Existenz der DLL überprüfen möchte und 
gegenfalls eine Fehlermeldung ausgeben, wenn eine der DLL fehlt.
#4314631
Lesenswert?

Gerhard_Berlin schrieb:
> Die C_Wrapper ist in visual studio c++ geschrieben und dort kann man
> eine Funktion "Check_if_DLLs_exist()"schreiben und beim fehlenden DLL
> eine Fehlernummer ausgeben.

Kann man.
Eine DLL ist erst mal eine Datei wie jede andere auch.
Und man kann prüfen, ob eine Datei existiert. Ob die Datei dann 
'Hamstibamsti.xyz' heisst oder irgendwie anders, ist dabei vollkommen 
egal.
Dein Problem ist also in keiner Weise irgendwie spezifisch für DLL. 
Mittels Google solltest du genug Möglichkeiten finden, wie man auf die 
Existenz einer Datei prüfen kann.
Du musst lernen, deine Probleme auf das jeweils wesentliche zu 
reduzieren. dann findest du auch mit Google Antworten auf deine Fragen.
Persönliche Seite #4314710
Lesenswert?

Gerhard_Berlin schrieb:
> Die C_Wrapper ist in visual studio c++ geschrieben und dort kann man
> eine Funktion "Check_if_DLLs_exist()"schreiben und beim fehlenden DLL
> eine Fehlernummer ausgeben.

Du kannst viel tun, wenn Du dazu Lust hast -- solange Du DLLs 
"automatisch lädst", d.h. durch Gebrauch einer Importlibrary und nicht 
durch manuelles LoadLibrary & GetProcAddress bleibt das vollkommen 
sinnfrei, denn Dein Programm fängt erst dann an, irgendetwas zu tun, 
wenn der Programmlader (das ist ein Teil von Windows) alle 
Abhängigkeiten aufgelöst und alle automatisch zu ladenden DLLs geladen 
hat.
Gast #4315119
Lesenswert?

Gerhard_Berlin schrieb:
> HMODULE dllHandle;
> dllHandle = loadLibrary(L"MyDLL.dll");
> if (dllHandle == NULL)
> {
>  // DLL not exist
> }
> ...
> soll ich auch:
> FreeLibrary(dllHandle);

Hallo Gerhard, vermutlich hast Du schon lange festgestellt, dass man das 
genau so machen kann:

1
HMODULE dllHandle;
2
dllHandle = loadLibrary(L"MyDLL.dll");
3

4
if (dllHandle != NULL)
5
{
6
 // DLL exists
7
 
8
 ...
9

10
 FreeLibrary(dllHandle);  
11
}

Und sollte jetzt das dllHandle Null sein, dann rufst Du natürlich keine 
Funktion aus der DLL auf, sondern machst eine MessageBox() auf und sagst 
dem Anwender, dass da eine DLL fehlt.
Das scheint mir eleganter als die Anwendung einfach nur abstürzen zu 
lassen.

Gruß Pit
Gast #4315843
Lesenswert?

Hallo,

wenn ich in meine Anwendung FreeLibrary(dllHandle) wie von Pit 
beschriben.
Dann stürtze Labview ab.

Pit schrieb:
> HMODULE dllHandle;
> dllHandle = loadLibrary(L"MyDLL.dll");
>
> if (dllHandle != NULL)
> {
>  // DLL exists
>
>  ...
>
>  FreeLibrary(dllHandle);
> }
Gast #4315856
Lesenswert?

Rufus Τ. F. schrieb:
> Du kannst viel tun, wenn Du dazu Lust hast -- solange Du DLLs
> "automatisch lädst", d.h. durch Gebrauch einer Importlibrary und nicht
> durch manuelles LoadLibrary & GetProcAddress bleibt das vollkommen
> sinnfrei

Vieleicht meint ihr was unterschiedliches beim Wort "automatisch".
Du meinst das das Betriebssystem automatisch die DLL beim Programmstart 
lädt.
Der TO meint aber vieleicht das ein Teil seines Programms (auf das er 
keinen Einfluss hat) eine DLL nachladen will, wenn es der Meinung ist 
sie zu brauchen und er vorher abprüfen will ob es diese DLL gibt.

Ich interpretiere jetzt aber auch nur die Aussage des TOs ohne Gewähr 
auf Richtigkeit.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren