Verfasst: 23.02.2009 15:51
Danke für die Info ...
Damit kann ich dann schon mal eine "mögliche Fehlerquelle" ausschließen...
Damit kann ich dann schon mal eine "mögliche Fehlerquelle" ausschließen...
Code: Alles auswählen
DeclareModule FileMap
Declare Create(Name.s, Size.i)
Declare Open(Name.s)
Declare Close(*Mem)
EndDeclareModule
Module FileMap
Global hMap.i
Procedure Create(Name.s, Size.i)
hMap = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
If hMap
ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure Open(Name.s)
hMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
If hMap
ProcedureReturn MapViewOfFile_(hMap, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
EndIf
EndProcedure
Procedure Close(*Mem)
UnmapViewOfFile_(*Mem)
CloseHandle_(hMap)
EndProcedure
EndModule
Code: Alles auswählen
XIncludeFile "_mod_SharedMemory.pbi"
Structure myMem
text.s{23}
quit.l
EndStructure
; test
Define *mem.myMem = FileMap::Create("MyMemory", SizeOf(myMem))
If *mem
*mem\text = "Feel the ..Pure.. Power"
*mem\quit = #False ; <-- ohne dem ist das unten eine Endlosschleife
While *mem\quit = #False
Delay(100)
Wend
FileMap::Close(*mem)
MessageRequester("MyMemory", "Client hat quit gesetzt")
EndIf
Code: Alles auswählen
XIncludeFile "_mod_SharedMemory.pbi"
Structure myMem
text.s{23}
quit.l
EndStructure
; test
Define *mem.myMem = FileMap::Open("MyMemory")
If *mem
MessageRequester("MyMemory", *mem\text)
*mem\quit = #True
FileMap::Close(*mem)
EndIf
Code: Alles auswählen
DeclareModule FileMap
Declare Create(Name.s, Size.i, Security = #False)
Declare Open(Name.s)
Declare Close(*Mem)
EndDeclareModule
Module FileMap
Global NewMap hMap.i()
Global SA.SECURITY_ATTRIBUTES
Global pSD.SECURITY_DESCRIPTOR
Global IsInitSecurity
Procedure Create(Name.s, Size.i, Security = #False)
Protected handle, *mem
If Security
If Not IsInitSecurity
If Not InitializeSecurityDescriptor_(@pSD, #SECURITY_DESCRIPTOR_REVISION)
ProcedureReturn 0
EndIf
If Not SetSecurityDescriptorDacl_(@pSD, #True, #Null, #False)
ProcedureReturn 0
EndIf
SA\nLength = SizeOf(SA)
SA\lpSecurityDescriptor = @pSD
SA\bInheritHandle = #True
IsInitSecurity = #True
EndIf
handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, @SA, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
Else
handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, @Name)
EndIf
If handle
*mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
hMap(Str(*mem)) = handle
ProcedureReturn *mem
EndIf
EndProcedure
Procedure Open(Name.s)
Protected handle, *mem
handle = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, @Name)
If handle
*mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
hMap(Str(*mem)) = handle
ProcedureReturn *mem
EndIf
EndProcedure
Procedure Close(*Mem)
Protected result
UnmapViewOfFile_(*Mem)
result = CloseHandle_(hMap(Str(*Mem)))
DeleteMapElement(hMap(), Str(*Mem))
ProcedureReturn result
EndProcedure
EndModule
Code: Alles auswählen
DeclareModule FileMap
Declare Create(Name.s, Size.i, Security = #False)
Declare Open(Name.s)
Declare Close(*Mem)
EndDeclareModule
Module FileMap
Global NewMap hMap.i()
Global SA.SECURITY_ATTRIBUTES
Global pSD.SECURITY_DESCRIPTOR
Global IsInitSecurity
Procedure Create(Name.s, Size.i, Security = #False)
Protected handle, *mem
If Security
If Not IsInitSecurity
If Not InitializeSecurityDescriptor_(@pSD, #SECURITY_DESCRIPTOR_REVISION)
ProcedureReturn 0
EndIf
If Not SetSecurityDescriptorDacl_(@pSD, #True, #Null, #False)
ProcedureReturn 0
EndIf
SA\nLength = SizeOf(SA)
SA\lpSecurityDescriptor = @pSD
SA\bInheritHandle = #True
IsInitSecurity = #True
EndIf
handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, @SA, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, Name)
Else
handle = CreateFileMapping_(#INVALID_HANDLE_VALUE, 0, #PAGE_READWRITE | #SEC_COMMIT | #SEC_NOCACHE, 0, Size, Name)
EndIf
If handle
*mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
hMap(Str(*mem)) = handle
ProcedureReturn *mem
EndIf
EndProcedure
Procedure Open(Name.s)
Protected handle, *mem
handle = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, Name)
If handle
*mem = MapViewOfFile_(handle, #FILE_MAP_ALL_ACCESS, 0, 0, 0)
hMap(Str(*mem)) = handle
ProcedureReturn *mem
EndIf
EndProcedure
Procedure Close(*Mem)
Protected result
UnmapViewOfFile_(*Mem)
result = CloseHandle_(hMap(Str(*Mem)))
DeleteMapElement(hMap(), Str(*Mem))
ProcedureReturn result
EndProcedure
EndModule