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