Seite 1 von 2

SharedMemory

Verfasst: 21.05.2008 05:15
von ts-soft
Nachdem ich den Code hier nicht finden konnte, hab ich in nochmal
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
Beispiel Ersteller:

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
Beispiel Client:

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

Re: SharedMemory

Verfasst: 21.05.2008 08:45
von Kiffi
@Thomas: Danke für den Code!

Ohne jetzt genau nachgesehen zu haben: Gibt es Vorteile, Nachteile,
Unterschiede zu GlobalSharedMemory in den PBOSL?

Grüße ... Kiffi

Verfasst: 21.05.2008 09:02
von Rings
Vorteil:
-besser für Threadsicher/Unicode zu kompilieren
weil Includefile
-Einfacher umzustellen für die zukunft.

Nachteil:
mehr Code(wenn das überhaupt ein Nachteil iss)

Verfasst: 21.05.2008 10:18
von Kiffi
Rings hat geschrieben:Vorteil:
-besser für Threadsicher/Unicode zu kompilieren
weil Includefile
nur, wenn man die GlobalSharedMemory-LIB verwendet.
Nicht, wenn man den GlobalSharedMemory-Source einbindet ;-)

Grüße ... Kiffi

Verfasst: 21.05.2008 16:57
von ts-soft
Funktionell sind die Sourcen gleich. Ich denke meiner ist kürzer und ver-
ständlicher, aber das denke ich immer :mrgreen:

Verfasst: 22.05.2008 08:21
von Rings
ts-soft hat geschrieben:Ich denke meiner ist kürzer und ver-
ständlicher, aber das denke ich immer :mrgreen:
Meine bessere Hälfte denkt genau anders herum

Verfasst: 22.05.2008 11:10
von 7x7
:mrgreen:

Verfasst: 23.02.2009 03:01
von STARGÅTE
Tachchen habe mal n Frage dazu:

Wie sicher ist das lesen und schreiben in diesem SharedMemory?

Damit meine ich, ob es ohne weitere Sicherheitsmaßnahmen möglich ist das ein Programm "wann es will" rein schreibt und das andere "wann es will" rausließt.

Würde das zu einem Absturz führen ? (IMA)

Oder liefert das lesen einfach nur "unerwünschte" (also nicht ganz vollständige) Daten?

Verfasst: 23.02.2009 09:04
von dige
mmmh, wenn ich das richtig verstehe, wird hier einfach von 2 oder mehreren Programmen eine Datei geöffnet und über die Windows API in den Speicher gemappt...genial!

Verfasst: 23.02.2009 09:16
von ts-soft
Wenn ich es richtig verstanden habe, ist es so, das wenn tatsächlich 2 oder
mehr gleichzeitig etwas ändern, sehen auch nur diese die Änderung.
Gibt also keine IMA aber falsche Ergebnisse.

Durch das ändern der Procedure könnte man auch die Rechte einschränken,
hab ich aber nicht berücksichtig, könnte es aber noch einbauen, falls
gewünscht.

gruß
Thomas