Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi DLL nach Benutzung wieder freigeben (https://www.delphipraxis.net/93942-dll-nach-benutzung-wieder-freigeben.html)

TheMiller 13. Jun 2007 16:40


DLL nach Benutzung wieder freigeben
 
Hallo,

ich habe ein kleines Problem. Ich habe ein Programm, welches Plug-Ins über DLLs einbindet. Jetzt möchte ich aber nicht alle DLLs beim Programmstart laden, sondern erst dann, wenn die einzelnen Module gebraucht werden. Das ist eigentlich auch kein Problem. Das Problem ist eher das Freigeben. Die PlugIn-DLLs enthalten allesamt Formulare, die der Anwender bedient. Schließt er nun ein Formular, wird es ja noch weiter ausgeführt. Wie kann ich jetzt feststellen, dass das PlugIn nicht mehr verwendet wird, sodass ich es dann freigeben kann..

Danke im Voraus

Bernhard Geyer 13. Jun 2007 17:07

Re: DLL nach Benutzung wieder freigeben
 
Da mußt du schon über die eigene Programmlogik dies Sicherstellen. Eine Funktion der Art UnloadDynamicLoadedDLLIfNoLongerNeeded gibt es nicht.

alzaimar 13. Jun 2007 18:10

Re: DLL nach Benutzung wieder freigeben
 
Macht das nicht Windows sowieso automatisch, bzw. 'on demand'?

Bernhard Geyer 13. Jun 2007 21:25

Re: DLL nach Benutzung wieder freigeben
 
Zitat:

Zitat von alzaimar
Macht das nicht Windows sowieso automatisch, bzw. 'on demand'?

Laden teilweise ja. Entladen: Nein. Es wird bei Nicht-Gebrauch der reale Ram freigegeben da ja aus der DLL die Teile bei Bedarf nachgeladen werden können. Ist aber dann Aufgabe des Speichermanagers des OS und der MPU des Prozessors.

TheMiller 14. Jun 2007 22:27

Re: DLL nach Benutzung wieder freigeben
 
Danke...

Hm... wie kann ich eine solche Funktion realisieren? Habe keine Idee.

Bernhard Geyer 16. Jun 2007 09:01

Re: DLL nach Benutzung wieder freigeben
 
Indem du allen Zugriff auf eine solche DLL über ein Klasse (Könnte das Fassaden-Muster sein). Und diese weis dann ob die DLL noch nötig ist oder nicht (z.B. Laden im Konstruktor, Endladen im Destruktor).

TheMiller 16. Jun 2007 11:07

Re: DLL nach Benutzung wieder freigeben
 
Danke, das werde ich mir nochmal genauer ansehen!

Schönes WE!

TheMiller 16. Jun 2007 11:41

Re: DLL nach Benutzung wieder freigeben
 
Ja... hier bin ich wieder...

Hab mir mal den Wiki-Eintrag angesehen und hier im Forum nach Fassade geschaut. Aber ich habe leider noch keine Vorstellung, wie das konkret funktioniert... Gibt es irgendwo ein Tutorial, das mir beim Verständnis helfen könnte?

EWeiss 16. Jun 2007 13:21

Re: DLL nach Benutzung wieder freigeben
 
Zitat:

Zitat von DJ-SPM
Ja... hier bin ich wieder...

Hab mir mal den Wiki-Eintrag angesehen und hier im Forum nach Fassade geschaut. Aber ich habe leider noch keine Vorstellung, wie das konkret funktioniert... Gibt es irgendwo ein Tutorial, das mir beim Verständnis helfen könnte?

Du hast ja auch noch die möglichkeit diese als ActiveX.dll auszulegen.
Kannst du über Interface realisieren.

Diese kannst du dann bei bedarf registrieren und unregistrieren

gruss Emil

TheMiller 24. Jun 2007 14:24

Re: DLL nach Benutzung wieder freigeben
 
Hallo,

hab mich nochmal damit beschäftigt und bin auf die Idee gekommen, dass das evtl auch über selbsterstellte Messages gehen kann. Ist das richtig, oder funktioniert das doch nicht. Habe noch nie eine Message selbst versendet bzw. erstellt.

Danke!

TheMiller 29. Jun 2007 13:28

Re: DLL nach Benutzung wieder freigeben
 
Wollte nochmal lieb nachfragen, ob das mit den Messages funktionieren kann? Ich dachte mir das so:

Wenn das PlugIn geschlossen wird (onCloseQuery etc) sendet es eine Nachricht an das Hauptprogramm. Dieses wertet die Message aus und gibt die DLL wieder frei (also das Plug-In)

Danke

Bernhard Geyer 29. Jun 2007 14:01

Re: DLL nach Benutzung wieder freigeben
 
Zitat:

Zitat von DJ-SPM
Wenn das PlugIn geschlossen wird (onCloseQuery etc) sendet es eine Nachricht an das Hauptprogramm. Dieses wertet die Message aus und gibt die DLL wieder frei (also das Plug-In)

Das könnte so gehen.

TheMiller 29. Jun 2007 14:10

Re: DLL nach Benutzung wieder freigeben
 
Ja super! Ähm... kennt jmd. ein kleines Tut zum erstellen eigener Messages?

Danke!

hoika 29. Jun 2007 14:20

Re: DLL nach Benutzung wieder freigeben
 
Hallo,

z.B. RegisterWindowsMessage('MeinPlugIn_eins');

Das ruft sowohl deine Hauptprogramm also auch dein Plugin auf,
der Return-Wert ist der gleiche.

Dann über PostMessage(hMainWnd..) die Nachricht ans Hauptfenster
(das hMainWnd muss das Hauptfenster aber an das Plugin übergeben).


Heiko
PS: Der Name sollte aber schon eindeutiger sein ;)

TheMiller 29. Jun 2007 14:29

Re: DLL nach Benutzung wieder freigeben
 
Danke, aber diese Methode verstehe ich nicht. Was bewirkt sie? Gibt es einen Unterschied zu dieser? Eigene Message

Danke

hoika 29. Jun 2007 14:51

Re: DLL nach Benutzung wieder freigeben
 
Hallo,

ja, das ist das gleiche (weiter unten, nicht WM_USER + X)

Windows erzeugt eine eindeutige Message-Nummer,
egal wer RegisterWindowsMessage aufruft (könnten sogar 2 verschiedene Programme sein)


Heiko

TheMiller 29. Jun 2007 15:07

Re: DLL nach Benutzung wieder freigeben
 
Also, ich habe es jetzt so gemacht:

Ich habe im Hauptprogramm und in dem PlugIn eine Message WM_UNLOADPLUGIN definiert. Beim Programmstart speichere ich das Handle von der MainForm und übergebe diese beim Öffnen an alle PlugIns. Da meine Plug-In-DLLs auch Forms enthalten, kann ich ja auf Schließen des PlugIns reagieren. In einem solchen Event sende ich einfach eine Message an das MainFormHandle mit WM_UNLOADPLUGIN und siehe da... es ist weg und der Speicher ist auch korrekt freigegeben!

Zu der anderen Lösung von hoika: Dies scheint dann also das gleiche wie "meine" Lösung zu sein!

Danke für eure Hilfe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:54 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