echtes "malloc" in PB (statt "AllocateMemory&
echtes "malloc" in PB (statt "AllocateMemory&
Hallo zusammen!
Ich habe folgendes Problem: ich möchte in PB eine DLL für eine Anwendung schreiben, die von mir erwartet, daß ich Daten (Zeichenketten) in vorher (von mir in der DLL) mittels "malloc" angelegten Speicherbereichen erzeuge und die "Gewalt" über diese Bereiche an die Anwendung abtrete.
Mit anderen Worten: die DLL ruft "malloc", die Anwendung später das zugehörige "free".
Mit "AllocateMemory" kann ich in PB zwar Speicher reservieren, dieser wird aber auch weiterhin von PB verwaltet - insbesondere am Ende der Anwendung von PB automatisch wieder freigegeben.
Weiß jemand einen Ausweg aus diesem Dilemma?
- kann man "malloc" von PB aus irgendwie direkt aufrufen (ohne dazu eine weitere DLL schreiben zu müssen)
- kann man PB dazu bewegen, per "AllocateMemory" angelegte Speicherbereiche zu "vergessen"?
Vielen Dank im Voraus für jede Art von Hilfe!
Ich habe folgendes Problem: ich möchte in PB eine DLL für eine Anwendung schreiben, die von mir erwartet, daß ich Daten (Zeichenketten) in vorher (von mir in der DLL) mittels "malloc" angelegten Speicherbereichen erzeuge und die "Gewalt" über diese Bereiche an die Anwendung abtrete.
Mit anderen Worten: die DLL ruft "malloc", die Anwendung später das zugehörige "free".
Mit "AllocateMemory" kann ich in PB zwar Speicher reservieren, dieser wird aber auch weiterhin von PB verwaltet - insbesondere am Ende der Anwendung von PB automatisch wieder freigegeben.
Weiß jemand einen Ausweg aus diesem Dilemma?
- kann man "malloc" von PB aus irgendwie direkt aufrufen (ohne dazu eine weitere DLL schreiben zu müssen)
- kann man PB dazu bewegen, per "AllocateMemory" angelegte Speicherbereiche zu "vergessen"?
Vielen Dank im Voraus für jede Art von Hilfe!
Mit freundlichen Grüßen,
Andreas Rozek
Andreas Rozek
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Danke für die schnelle Antwort!
Aber sie löst (vermutlich) nicht das Problem, nämlich daß die oben erwähnte Anwendung den von der DLL reservierten Speicher vermutlich schon vorher freigegeben hat!
Wenn jetzt die DLL entladen wird, versucht sie bereits längst freigegebenen Speicher erneut freizugeben - sollte es da nicht heftig knallen?
Darüber hinaus müßte sich PB unnötigerweise unzählige angeblich noch reservierte Speicherbereiche merken (von denen es annimmt, daß sie noch freigegeben werden müßten) was bei langen Laufzeiten eine ganze Menge Speicher in Anspruch nehmen dürfte.
Aber sie löst (vermutlich) nicht das Problem, nämlich daß die oben erwähnte Anwendung den von der DLL reservierten Speicher vermutlich schon vorher freigegeben hat!
Wenn jetzt die DLL entladen wird, versucht sie bereits längst freigegebenen Speicher erneut freizugeben - sollte es da nicht heftig knallen?
Darüber hinaus müßte sich PB unnötigerweise unzählige angeblich noch reservierte Speicherbereiche merken (von denen es annimmt, daß sie noch freigegeben werden müßten) was bei langen Laufzeiten eine ganze Menge Speicher in Anspruch nehmen dürfte.
Mit freundlichen Grüßen,
Andreas Rozek
Andreas Rozek
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Normalerweise sollten die Speicherbereiche einer DLL immer zu denen der Anwendung
gehören, das die DLL geladen und aufgerufen hat.
Aber wenn du dir zu unsicher damit bist, nutz doch einfach die entsprechende API-Funktion GlobalAlloc.
gehören, das die DLL geladen und aufgerufen hat.
Aber wenn du dir zu unsicher damit bist, nutz doch einfach die entsprechende API-Funktion GlobalAlloc.
Eine Anwendung oder DLL sollte beim entladen nicht selbst den Speicher freigeben. Das übernimmt Windows. Windows gibt automatisch jedweden reservierten Speicher frei, schließt Handles, etc. Von daher ist es gut möglich das die DLL den Speicher garnicht selbst freigibt am Ende.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

Hab ich ja auch nicht geschrieben.Rozek hat geschrieben: die PB-Dokumentation (zu "AllocateMemory") besagt aber etwas anderes: kein Hinweis darauf, daß sich "AllocateMemory" in einer DLL anders verhält als in einer Anwendung...
Die Doku besagt folgendes:
Das heisst aber nicht zwingend das PB die Speicherbereiche freigibt. Da Windows das sowieso macht, sollte man das auch Windows überlassen und ich nehme mal an das es bei PB auch so ist.Hinweis: Alle reservierten Speicherbereiche werden automatisch freigegeben, wenn das Programm beendet wird.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!
Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke!

malloc ist ein 'c' befehl und keine API.
Ein bessere vorgang ist es den Speicher von der Applikation zu erstellung und dann den Zeiger auf den Spiecher zu übergeben.
Ist eine normale vorgehensweise.
Beispiel
FF 
Ein bessere vorgang ist es den Speicher von der Applikation zu erstellung und dann den Zeiger auf den Spiecher zu übergeben.
Ist eine normale vorgehensweise.
Beispiel
Code: Alles auswählen
ProcedureDLL MyFunction(*buffer, len.l)
If len < $FFFF
ProcedureReturn #False
EndIf
PokeS(*buffer, "Hello World")
ProcedureReturn #True
EndProcedure
; Applikation
*mem = AllocateMemory($FFFF)
result = MyFunction(*mem, $FFFF)
Debug result
If result
Debug PeekS(*mem)
EndIf

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
mk-soft hat recht, malloc() macht unter umständen einiges anders als AllocateMemory().
Einfach den Befehl aus der C runtime importieren:
Einfach den Befehl aus der C runtime importieren:
Code: Alles auswählen
ImportC "msvcrt.lib"
malloc.i(size)
realloc.i(*ptr, size)
free(*ptr)
EndImport
*p = malloc(500)
PokeS(*p, "Hallo Welt")
Debug PeekS(*p)
free(*p)