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.