Forum: PC-Programmierung Überprüfen auf DLL existens in einem Directory


von Gerhard_Berlin (Gast)


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?

von Michael B. (laberkopp)


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.

von Rene H. (Gast)


Lesenswert?

Ist dieses Programm unabhängig von den der die dll braucht?

Eigentlich reicht ein GetModuleHandle um zu wissen ob sie geladen ist.

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Rene H. (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Wenn sie automatisch geladen werden, musst Du nicht prüfen,

Das war auch mein Gedanke, nur ist die Fragestellung etwas unklar.

Gerhard_Berlin schrieb:
> Dynamische loopen, ob die DLLs (in Application Directory) existieren?

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

von Gerhard_Berlin (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Alles schön und gut, nur kann das Dein Programm nicht tun, wenn es die 
DLLs über eine Importlibrary anspricht (sprich "automatisch lädt"). Das 
Laden erfolgt dann nämlich komplett außerhalb Deiner Kontrolle, 
gesteuert durch den Programmlader, und wird vollständig durchgeführt, 
bevor Dein Programm auch nur das erste Mal zucken kann.

von Gerhard_Berlin (Gast)


Lesenswert?

Ja aber ich kann es doch prüfen, ob die Dlls existieren und gegebenfalls 
laden bevor es knallt.

Die abhängige DLLs werden geladen nur wenn sie gebraucht sind.

von Peter II (Gast)


Lesenswert?

Gerhard_Berlin schrieb:
> Ja aber ich kann es doch prüfen, ob die Dlls existieren und gegebenfalls
> laden bevor es knallt.

In welchen Programm willst du denn prüfen?

von Gerhard_Berlin (Gast)


Lesenswert?

In C_Wrapper kann ich doch prüfen und zwar beim starten.

von Peter II (Gast)


Lesenswert?

Gerhard_Berlin schrieb:
> In C_Wrapper kann ich doch prüfen und zwar beim starten.

nein, wie schon von   Rufus Τ. Firefly geschrieben, dein Code wird gar 
nicht ausgeführt wenn die abhängigen dlls fehlen.

von Gerhard_Berlin (Gast)


Lesenswert?

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.

von Gerhard_Berlin (Gast)


Lesenswert?

Also wie kann ich dann prüfen? Auf Labview Seite?

von Wolfgang (Gast)


Lesenswert?

Willst du die DLL prüfen oder reicht es zu prüfen, ob in dem 
Labview.exe-Folder ein File mit dem Namen der DLL existiert?

von Gerhard_Berlin (Gast)


Lesenswert?

Es reicht zu prüfen, ob in dem Labview.exe-Folder ein File mit dem Namen 
der DLL existiert.

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


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.

von Pit (Gast)


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

von Gerhard_Berlin (Gast)


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);
> }

von Der Andere (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.