Hallo Forum,
ich möchte mit Free Pascal / Lazarus eine DLL für Windows erzeugen. Die Funktionen und ihr Verhalten sind vorgegeben (wegen der notwendigen Kompatibilität zu anderen DLLs). Bisher habe ich allerdings absolut keine Erfahrung mit DLLs. Mein Problem ist die Verwaltung des Speichers, den die Funktionen in der DLL zum Speichern von Datenstrukturen benötigen.
Wenn ich das System richtig verstanden habe, wird eine DLL entladen, sobald sie nicht mehr benötigt wird, d.h. wenn keine Programm mehr läuft, das ihre Funktionen verwendet. Wird damit auch der von den Funktionen der DLL dynamisch reservierte Speicher wieder freigegeben? Ich habe gelesen, dass man mit einer automatisch beim Laden aufgerufenen Funktion namens DllMain eine DLL initialisieren kann. Gibt es so etwas evtl. auch beim Entladen, um den reservierten Speicher freizugeben? Wenn nicht, was muss ich tun, wenn ich (wegen der Kompatibilitätsanforderungen zu bestehenden DLLs) keine Möglichkeit habe, der DLL explizit mitzuteilen, dass ich den Speicher nicht mehr brauche?
Vielen Dank für Eure Hilfe!
Beste Grüße,
Ralf
Speicherverwaltung in DLLs
-
- Lazarusforum e. V.
- Beiträge: 3158
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Speicherverwaltung in DLLs
DllMain wird auch beim Entladen der Bibliothek aufgerufen: http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Kannst du den Speicher nicht einfach selbst freigeben?
dl5eu hat geschrieben:Gibt es so etwas evtl. auch beim Entladen, um den reservierten Speicher freizugeben? Wenn nicht, was muss ich tun, wenn ich (wegen der Kompatibilitätsanforderungen zu bestehenden DLLs) keine Möglichkeit habe, der DLL explizit mitzuteilen, dass ich den Speicher nicht mehr brauche?
Kannst du den Speicher nicht einfach selbst freigeben?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Speicherverwaltung in DLLs
Hallo Socke,
vielen Dank für die schnelle Antwort und den Hinweis!
Die zu implementierenden Funktionen müssen kompatibel zu Funktionen gleichen Namens in anderen DLLs sein, die ich aber nicht besitze und auch wegen anderer Hardware nicht einsetzen könnte. Wenn aber DllMain auch beim Entladen einer DLL aufgerufen wird und ich dies feststellen kann (DLL_PROCESS_DETACH), kann ich in dieser Funktion den reservierten Speicher freigeben, weil er dann definitiv nicht mehr benötigt wird und das Problem müsste gelöst sein. Mal sehen. Versuch macht klug
Beste Grüße,
Ralf
vielen Dank für die schnelle Antwort und den Hinweis!
Die zu implementierenden Funktionen müssen kompatibel zu Funktionen gleichen Namens in anderen DLLs sein, die ich aber nicht besitze und auch wegen anderer Hardware nicht einsetzen könnte. Wenn aber DllMain auch beim Entladen einer DLL aufgerufen wird und ich dies feststellen kann (DLL_PROCESS_DETACH), kann ich in dieser Funktion den reservierten Speicher freigeben, weil er dann definitiv nicht mehr benötigt wird und das Problem müsste gelöst sein. Mal sehen. Versuch macht klug
Beste Grüße,
Ralf
- corpsman
- Lazarusforum e. V.
- Beiträge: 1498
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Speicherverwaltung in DLLs
In dLL's müsste es doch auch den
Block geben. Dort könntest du deine Routinen zum Laden / entladen deines Speichers aufrufen, ..
Code: Alles auswählen
Initialization
// und
Finalization
Block geben. Dort könntest du deine Routinen zum Laden / entladen deines Speichers aufrufen, ..
--
Just try it
Just try it
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Speicherverwaltung in DLLs
müsste, hätte, könnte.
Nein geht nicht.
Nein geht nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/