Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Dynamisch eingebundene Dll im laufenden Betrieb austauschen (https://www.delphipraxis.net/216273-dynamisch-eingebundene-dll-im-laufenden-betrieb-austauschen.html)

hschmid67 2. Dez 2024 15:48

Dynamisch eingebundene Dll im laufenden Betrieb austauschen
 
Hallo zusammen,

ich versuche gerade vergeblich, eine dynamisch geladene eigene DLL in meinem Programm zu deaktivieren (FreeLibrary), sie neu zu kompilieren und neu zu laden, aber leider funktioniert das nicht so wie erwartet.
  1. Laden der DLL: LoadLibrary
  2. Ent-Laden der DLL: FreeLibrary
  3. Ändern des Quellcodes
  4. Neu kompilieren der DLL (mit msbuild) in ein Temp-Verzeichnis
  5. Umbenennen der bisherigen DLL
  6. Verschieben der neuen DLL ins alte Verzeichnis
  7. Laden der DLL: LoadLibrary

Doch wenn ich die neue DLL lade und eine Funktion aufrufe, erhalte ich immer noch das Ergebnis der alten DLL.

Hmmm, vermutlich klappt das Ent-Laden nicht so ganz. Denn wenn ich dann das Programm schließe und neu starte, ist die neue Version der DLL verfügbar. Wie kann ich denn überprüfen, ob die alte Version wirklich entladen ist? Gibt es ein (freies) Tool, mit dem man alle von einem Prozess geladenen DLLs gut und übersichtlich sehen kann, vielleicht sogar live, sodass ich das Ent-Laden nachverfolgen könnte?

Bin für jede Hilfe dankbar.
Viele Grüße
Harald

Mavarik 2. Dez 2024 16:24

AW: Dynamisch eingebundene Dll im laufenden Betrieb austauschen
 
Ohne Source : [GlaskugelMode = ON]

Vielleicht hast Du einen statischen Link auf die DLL - 2x geladen?

Mavarik

PS: Ich mache um jede DLL einen Interface-Wrapper. Out of Scope und weg...

himitsu 2. Dez 2024 16:43

AW: Dynamisch eingebundene Dll im laufenden Betrieb austauschen
 
Löschen, anstatt Umbenennen.

Umbenennen/verschieben geht auch, selbst wenn eine Datei als MMF geladen ist, wie z.B. von einem normalen LoadLibrary (nur bei direktem Zugriff über ein aktives DateiHandle nicht)
Löschen lässt sie sich dagegen aber nicht, so lange sie noch irgendwo geladen ist.

hschmid67 2. Dez 2024 18:37

AW: Dynamisch eingebundene Dll im laufenden Betrieb austauschen
 
Danke für Eure Unterstützung, die mich dann doch auch auf die richtige Debugging-Spur gebracht hat:

ich hab alle LoadLibrary und FreeLibrary mit Codesite ausgeben lassen:

Delphi-Quellcode:
lHandle := LoadLibrary(PChar(mModuleFilename));
CodeSite.Send('LoadLibrary', lHandle);
...
CodeSite.Send('FreeLibrary', lHandle);
FreeLibrary(lHandle);
und im einen Fall bekomme ich bei lHandle eine gültige Zahl, beim FreeLibrary aber ist lHandle = 0 :-(

Also muss ich da weitersuchen ;-)

Vielen Dank und schönen Abend noch
Harald

jaenicke 2. Dez 2024 19:28

AW: Dynamisch eingebundene Dll im laufenden Betrieb austauschen
 
Zitat:

Zitat von hschmid67 (Beitrag 1543789)
ich hab alle LoadLibrary und FreeLibrary mit Codesite ausgeben lassen:

Kannst du das auf dem PC mit Delphi nicht nachstellen? Sonst wäre ein simpler Haltepunkt ja um Größenordnungen einfacher. Mit einem Datenhaltepunkt kannst du auch sofort feststellen, wo die Variable lHandle geändert wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz