AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL entladen

Ein Thema von hanspeter · begonnen am 7. Mär 2006 · letzter Beitrag vom 7. Mär 2006
Antwort Antwort
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#1

DLL entladen

  Alt 7. Mär 2006, 11:01
Kann sich eigentlich eine Dll selbst entladen?

Ich bin dabei Forms in eine DLL auszulagern.
Sind diese mit Show geöffnet, soll die Dll beim Schließen des Form
entladen werden.

Bisher mache ich das beim Schließen der Form (Action := cafree) mit einer
Message bzw. einen Callback an das aufrufende Programm.
Das Parent übergebe ich ohnehin.
Und bitte keinen Hinweis, das es mit BPL alles besser geht.
Der Einsatz von Dll statt BPL hat Gründe.

Gruß
Peter
  Mit Zitat antworten Zitat
shmia

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

Re: DLL entladen

  Alt 7. Mär 2006, 11:22
Du öffnest die DLL mit LoadLibrary und bekommst ein Handle.
Mit CloseLibrary(handle) wird die DLL geschlossen; wo ist also das Problem ?
Andreas
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#3

Re: DLL entladen

  Alt 7. Mär 2006, 11:45
Zitat von shmia:
Du öffnest die DLL mit LoadLibrary und bekommst ein Handle.
Mit CloseLibrary(handle) wird die DLL geschlossen; wo ist also das Problem ?
So mache ich das ja jetzt.
(CloseLibrary gibt es übrigens nicht)
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.

Mich interessiert, ob es die Möglichkeit gibt, dass sich die Dll selbst entläd.
Bzw. was passiert, wenn Freelibrary in der DLL selbst steht?

Gruß Peter
  Mit Zitat antworten Zitat
shmia

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

Re: DLL entladen

  Alt 7. Mär 2006, 13: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
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#5

Re: DLL entladen

  Alt 7. Mär 2006, 14:18
Danke für die Tips.
Mit Postmessage hatte ich schon experimentiert. Hat auch funktioniert.
Bei dem Callback bin ich gelandet, weil ich einen Dll Handler für das Programm
geschrieben habe (und ein Modul auf Dll Seite)
1. Die Dll wird mit Loadlibrary erzeugt.
2. Es wird Aplication.Handle, Parenhandle und Dll-Handle übergeben.
3. Die Form wird mit Show angezeigt.
4. Bei Close der Form in der Dll wird die Form mit Action := cafree freigegeben.
5. Das aufrufende Programm (hier der Dll Handler) wird über Callback informiert, dass die
Dll freigegeben werden kann. Dazu wird das eigene (vorherübergebenen DLL-Handle als Kennung
benutzt.
Kann man eigentlich in der Dll das Handle derselben herausbekommen?

Der Vorschlag mit Messages und PostMessage ist eleganter. Hier habe ich jedoch das Problem,
dass mein DLL Handler nicht von Twincontrol abstammt und keine Botschaften empfangen kann.
Hier müßte ich dann im Mainfenster der Anwendung die Botschaft abfangen und zum dem
Handler durchschleifen.

BPL möchte ich aus zwei Gründen nicht verwenden.
1. Ohne eine automatische Updatekontrolle ist das System zu störanfällig.
Das Programm muß unter sehr robusten Umgebungsbedingungen laufen und das fast immer am
Wochenende. Ein Internetzugang steht meist nicht zur Verfügung.
Die Beziehungen zwischen Hauptpgrogramm und Dll sind so lose, dass eigentlich nur der
Datenbankname (Firebird) und eine ID zu übergeben sind.

2. Sollte ich in absehbarer Zeit gezwungen sein, auf Net überzugehen, dann kann ich große
Teile des Programms (die Dll) erst einmal weiternutzen.

Kennt wehr übrigends ein brauchbares (auch kostenpflichtiges) DLL Framework?

Gruß
Peter
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#6

Re: DLL entladen

  Alt 7. Mär 2006, 14:37
Zitat von hanspeter:
Der Vorschlag mit Messages und PostMessage ist eleganter. Hier habe ich jedoch das Problem,
dass mein DLL Handler nicht von Twincontrol abstammt und keine Botschaften empfangen kann.
Hier müßte ich dann im Mainfenster der Anwendung die Botschaft abfangen und zum dem
Handler durchschleifen.
Vielleicht hilft Dir AllocateHwnd aus Classes.pas. Ein Beispiel findest du in der Implementation von TTimer in ExtCtrls.pas.
Gruß, teebee
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: DLL entladen

  Alt 7. Mär 2006, 14:51
Bei AllocateHWnd unbedingt das Beispiel in der Hilfe ansehen. Man muss DefWindowProc fuer alle Messages aufrufen.
Wenn man das nicht macht gibt es z. B. Probleme mit dem Windows-Shutdown. Das Fenster unterbricht naemlich dann den Shutdown.
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#8

Re: DLL entladen

  Alt 7. Mär 2006, 16:30
[quote="Robert Marquardt"]Bei AllocateHWnd unbedingt das Beispiel in der Hilfe ansehen. Man muss DefWindowProc fuer alle Messages aufrufen.
quote]

Danke für den Tip.
Du glücklicher. Im Profil sehe ich, dass Du noch mit D6 arbeitest.
Beispiel in Hilfe ist in D2006 nicht mehr.
Irgendwo habe ich aber noch ein D7 installiert.

Gruß Peter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz