Speicherverwaltung in DLLs

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Speicherverwaltung in DLLs

Beitrag von dl5eu »

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

Socke
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

Beitrag von Socke »

DllMain wird auch beim Entladen der Bibliothek aufgerufen: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

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

dl5eu
Beiträge: 33
Registriert: Do 12. Sep 2013, 12:40

Re: Speicherverwaltung in DLLs

Beitrag von dl5eu »

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

Benutzeravatar
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

Beitrag von corpsman »

In dLL's müsste es doch auch den

Code: Alles auswählen

 
Initialization
// und
Finalization
 


Block geben. Dort könntest du deine Routinen zum Laden / entladen deines Speichers aufrufen, ..
--
Just try it

Christian
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

Beitrag von Christian »

müsste, hätte, könnte.

Nein geht nicht.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Antworten