DLL entladen
-
Mit welchem Befehl entlade ich eine DLL.
-
Fall sie vorher mit LoadLibrary geladen wurde; mit FreeLibrary.
Simon
-
Nein LoadLibrary wird nicht verwendet. Eigentlich wird nur die Header der exportierten DLL funktionen eingebunden und die Funktionen aufgerufen.
-
Wohl kaum: dazu müsste noch eine *.lib eingebunden werden (via Linker Settings oder #pragma) ODER es ist eine COM Komponente, welche aber mit #import eingebunden wird.
Simon
-
in der Export Headerdatei stehjt noch
#pragma code(Test.dll)drin. Das war aber alles
-
und am Ende der Headerdatei:
#pragma code();
-
Ich habe dieses Pargma nicht gefunden. Existiert es wirklich?
http://msdn.microsoft.com/en-us/library/d9x1s805.aspx
-
sorry falls ich deine frage nicht richtig verstanden habe, aber meinst du das vielleicht so?
if (FreeLibrary(GetModuleHandle("lala.dll")) != 0) printf("erfolgreich entladen!"); else printf("dll konnte nicht entladen werden [%d]", GetLastError());
-
Schau Dir mit DEPENDS an wie die DLL geladen wird.
Evtl. erzeuge ein Profil mit DEPENDS.Explizit geladene DLLs (LoadLibrary) entlädst Du, wenn Du sienicht mehr benötigst. (FreeLibrary)
Implizit geladene DLLs können nicht entladen werden ohne die funktionsfähigkeit Deines Programmes zu gefährden.
COM DLLs entalden sich irgendwann von selbst, wenn diese nicht mehr benutzt werden.
Warum willst Du das also tun?
-
Warum willst Du das also tun?
Meine DLL wird von einem Programm das C Script enthält geladen. Wenn das script nun gestartet wird - das Programm in Runtime geht - wird meine DLL geladen. Wenn nun das Script gestopt wird, wird die DLL aber nicht wieder entladen. Erst wenn das Programm geschlossen wird. Wurde das Script nun gestoppt, aber das Programm nicht geschlossen und das Script wieder neu gestartet, greift ein anderer Thread als der der beim ersten Start Dialoge erzeugt hat in der DLL, auf diese zu. Und das verursacht Fehler. Nun sollte die DLL entladen werden, um so die Dialoge zu löschen und beim erneuten start wieder frisch anzulegen.
Kompliziert oder?
-
Kompliziert oder?
Anscheinend ja. So kopliziert dass keiner helfen kann?
-
Dann ist die DLL falsch programmiert.
Was ist das für ein Script? C-Script sagt mir nichts.
Du kannst vor allem keine DLL entladen, die noch von anderen Teilen Deiner Software genutzt wird. Was passiert wenn dieser Teil weiter läuft? Peng...
-
Dann ist die DLL falsch programmiert.
Falsch! Ok und was?
Was ist das für ein Script? C-Script sagt mir nichts.
Ist eigentlich reines C. Nennt sich nur in der Umgebung Script.
Du kannst vor allem keine DLL entladen, die noch von anderen Teilen Deiner Software genutzt wird
Sie wird nicht mehr benutzt nur nicht entladen. Undb eim erneuten Start wird sie ja wieder neu angezogen wenn sie nicht bereits geladen ist.
-
Falsch an dieser DLL ist, dass Du damit rechnest dass bestimmte global Vaiablen eben nur von einem Thread aus verwendet werden oder eben in bestimmter Weise initialisiert sind.
Wenn die Nutzung einen Aufruf ausmehreren Threads vorsieht, dann muss das die DLL eben berücksichtigen. Du dürftest dann evtl. eben keine globalen Varablen verwenden sondern müsstest threadlokalen Speichern nutzen.
Wenn die DLL nicht entladen wird, dann stimmt was mit dem C-Skript nicht, oder dem Modul, das diese Datei lädt.
-
Martin Richter schrieb:
[...]Implizit geladene DLLs können nicht entladen werden ohne die funktionsfähigkeit Deines Programmes zu gefährden.[...]
Damit sagst Du ja indirekt, dass es möglich ist. Weißt du auch wie? Mich würde das sehr interessieren...
(Sorry für das Ausgraben, aber das passt gerade sehr zu meinem Problem...)
-
guck dir LdrUnloadDll an
