Entwickler-Ecke

Windows API - Speicherallokierung zwischen verschiedenen Modulen


Tobi482 - Fr 01.10.10 16:53
Titel: Speicherallokierung zwischen verschiedenen Modulen
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


Delete - Fr 01.10.10 17:23

Normalerweise reserviert man den Speicher in der Exe und übergibt einen Zeiger an die DLL-Funktion. Siehe dazu: http://www.michael-puff.de/Artikel/StringDLL.shtml

Eine DLL wird erst dann entladen, wenn ihr Referenzzähler null ist.


Tryer - Fr 01.10.10 17:26

DllMain [http://msdn.microsoft.com/en-us/library/ms682583%28v=VS.85%29.aspx] zu implementieren und auf DLL_PROCESS_DETACH zu reagieren kann ggf. auch weiterhelfen.

Grüsse, Dirk


Tobi482 - 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 - 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.