aufbereitet, da ich denke, der eine oder andere kann das gebrauchen.
Die Include: ("shared_memory.pbi")
Code: Alles auswählen
; PB 3.xx (mit kl. Anpassungen), PB 4.xx (evtl. sind nicht alle konstanten in allen Versionen deklariert)
; Windows only
Define HandleMap.l
; erstellt oder öffnet einen gemeinsamen benannten Speicher
; sollte der Speicher unter dem Namen bereits erstellt sein,
; so wird er geöffnet und Size wird ignoriert.
; dies entspricht dann OpenSharedMemory
Procedure AllocateSharedMemory(Name.s, Size.l)
Shared HandleMap
HandleMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE|#SEC_COMMIT|#SEC_NOCACHE, 0, Size, @Name)
If HandleMap
ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
; öffnet einen bereits erstellten benannten Speicher
Procedure OpenSharedMemory(Name.s)
Shared HandleMap
HandleMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
If HandleMap
ProcedureReturn MapViewOfFile_(HandleMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
; gibt den Speicher für den aktuellen Process frei.
; erst wenn der letze Process den Speicher freigegeben
; hat, wird er endgültig freigegeben!
Procedure FreeSharedMemory(MemoryAddress.l)
Shared HandleMap
UnmapViewOfFile_(MemoryAddress)
CloseHandle_(HandleMap)
EndProcedure
Code: Alles auswählen
EnableExplicit
XIncludeFile "shared_memory.pbi"
Structure myMem
text.s{23}
quit.l
EndStructure
; test
Define *mem.myMem = AllocateSharedMemory("MyMemory", SizeOf(myMem))
If *mem
*mem\text = "Feel the ..Pure.. Power"
While *mem\quit = #False
Delay(100)
Wend
FreeSharedMemory(*mem)
MessageRequester("MyMemory", "Client hat quit gesetzt")
EndIf
Code: Alles auswählen
EnableExplicit
XIncludeFile "shared_memory.pbi"
Structure myMem
text.s{23}
quit.l
EndStructure
; test
Define *mem.myMem = OpenSharedMemory("MyMemory")
If *mem
MessageRequester("MyMemory", *mem\text)
*mem\quit = #True
FreeSharedMemory(*mem)
EndIf