Thema: Delphi DLL entladen

Einzelnen Beitrag anzeigen

shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: DLL entladen

  Alt 7. Mär 2006, 12:48
Zitat von hanspeter:
Das Problem ist, wenn ich ein formular mit Show anzeige, dann ist das für eine unbestimmte Zeit geöffnet und wird spätestens bei Programmende mit FreeLibrary entfernt.
Wird zur Lebzeit des Programmes das Formular geschlossen, so rufe ich jetzt über einen Callback
das übergeordnete Programm, um dort ein FreeLibrary zu veranlassen. Das muß noch Zeitverzögert
sein, damit dem Callback nicht der Boden weggezogen wird.
Die DLL muss auf jeden Fall aus dem Kontext der Hauptanwendung geschlossen werden.
Anstelle einen Callback kannst du auch eine Windows-Message verwenden.
Dies erspart dir die Zeitverzögerung.
Delphi-Quellcode:
// im Hauptprogram
const
   UM_UNLOAD_DLL = WM_USER + 100;
type
TMainForm = class(TForm)

   procedure UMUnloadDLL(var msg: TMessage); message UM_UNLOAD_DLL;

end;
...
procedure TMainForm.UMUnloadDLL(var msg: TMessage);
begin
   ShowMessage('DLL entladen');
   FreeLibrary(DLLhandle);
end;
Damit die DLL weiss, an welches Window die Message geschickt werden soll,
muss du das Handle des Hauptformulars irgendwie der DLL mitteilen.
Delphi-Quellcode:
// und in der DLL
const
   UM_UNLOAD_DLL = WM_USER + 100;

procedure TDLLForm.FormDestroy(Sender: TObject);
begin
   // Mitteilung an Hauptformular der Anwendung, dass die DLL
   // jetzt entladen werden kann.
   PostMessage(FMainformhandle, UM_UNLOAD_DLL, 0, 0);
end;
Übrigens:
Wenn du ActiveX-DLLs verwendest, dann wird das Freigeben der DLL vom
Betriebssystem übernommen. Allerdings wird eine ActiveX DLL nicht sofort
entladen, sondern erst nach einer bestimmten Haltezeit.
Andreas
  Mit Zitat antworten Zitat