Autor Beitrag
Tobi482
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Fr 01.10.10 16:53 
Hi Leute,

ich habe eine Frage zur Speicherverwaltung von Delphi. Ich habe ein C++ Projekt welches eine Delphi7 DLL dynamisch lädt und verwendet. Die exportierte Funktion der DLL reservierte Speicher mit der GetMemory-Funktion und gibt den Pointer zu diesem Speicherblock an das C++ Hauptprogramm zurück. Jedoch habe ich bedenken über Speicherlecks.

Frage 1:
Wenn ich Speicher in einer normalen EXE-Datei reserviere und diesen nicht wieder freigebe, wird der Speicher beim Beenden zwangsweise wieder freigegeben (unschön). Das C++ Hauptprogramm lädt die DLL mit dem Befehl LoadLibrary ein und entfernt sie mit FreeLibrary wieder. Was passiert danach mit dem von der DLL reservierten Speicher?

Wird er wie bei einer normalen EXE "zwangsreleased" und steht dem Hauptprogramm nicht mehr zur Verfügung?

Frage 2:
Kann Speicher der innerhalb der DLL mit GetMemory allokiert wurde im C++ Hauptprogramm mit delete freigegeben werden? Oder bräuchte ich eine extra Funktion in der DLL um den Speicher der von Delphi reserviert wurde auch von Delphi wieder freigeben zu lassen? Wenn ich so eine Funktion brauche, darf die DLL zwischendurch mit FreeLibrary freigegeben werden (1. Dll laden, 2. speicher durch dll reservieren, 3. dll entladen, 4. dll laden, 5. speicher durch dll freigeben, 6. dll entladen)?

Bin für jeden Tipp dankbar :)

Mit freundlichen Grüßen
Tobi


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 01.10.2010 um 22:54
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 01.10.10 17:23 
Normalerweise reserviert man den Speicher in der Exe und übergibt einen Zeiger an die DLL-Funktion. Siehe dazu: www.michael-puff.de/...ikel/StringDLL.shtml

Eine DLL wird erst dann entladen, wenn ihr Referenzzähler null ist.
Tryer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 226
Erhaltene Danke: 7



BeitragVerfasst: Fr 01.10.10 17:26 
DllMain zu implementieren und auf DLL_PROCESS_DETACH zu reagieren kann ggf. auch weiterhelfen.

Grüsse, Dirk
Tobi482 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 135



BeitragVerfasst: Fr 01.10.10 17:43 
die dll lädt eine bilddatei. ich kann ja erst einmal als workaround eine funktion getImgWidth und getImgHeight um die allokierung im Hostprozess vorzunehmen. aber die antwort auf die fragen wäre trotzdem interessant
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 01.10.10 23:51 
Du brauchst gar nicht die Breite und Höhe des Bildes. In der Regel übergibst du einen Speicherbereich an die DLL und dessen Größe als Pointer.

Wenn der Speicherbereich zu klein ist, wird die benötigte Größe in dem Größenparameter zurückgegeben. Dann kannst du genug Speicher reservieren und die Funktion erneut aufrufen.

Wenn dann der Puffer groß genug ist, dann packst du deine Daten dort hinein und gibst die Anzahl der geschriebenen Bytes in dem Größenparameter zurück.