Hallo,
einen solchen globalen Speicher gibt es im 32bit-Windows leider nicht. Du kannst ihn aber mit den API-Funktionen CreateFileMapping() [bzw. OpenFileMapping()] und MapViewOfFile() "emulieren".
Hier sind zwei Beispiel Quellcodes dazu: Das 2. Programm liest die Daten aus, die das erste in den gemeinsam genutzten Speicher schreibt. Voraussetzung ist Profan 7.0 (wegen UserMessages)
Programm 1:
DEF CreateFileMapping(6) !"KERNEL32","CreateFileMappingA"
DEF MapViewOfFile(5) !"KERNEL32","MapViewOfFile"
DEF CloseHandle(1) "KERNEL32","CloseHandle"
declare name$
declare hFileMap&,backup&,pMem#
declare targetWin&
dim pMem#,@mul(1024,50) '50 kb
window 0,0-300,200
windowtitle "FileMapping - Server"
'---FileMapping-Objekt erstellen:
let name$ = "-$filemap01"
let hFileMap& = CreateFileMapping($FFFFFFFF,0,4,0,@mul(1024,50),Addr(name$))
'---"Datei" in den Speicher abbilden und Ergebnis einer Bereichsvariablen zuweisen:
let backup& = pMem#
let pMem# = MapViewOfFile(hFileMap&,983071,0,0,0) '983071 = FILE_MAP_ALL_ACCESS
'---Auf anderen Prozess warten:
print "Warte auf Client..."
whilenot targetWin&
let targetWin& = @FindWindow("FileMapping-Client")
Sleep 100
wend
print "Client gefunden - Daten geschrieben"
'---Daten in den Speicher schreiben und dem Zielfenster signalisieren, dass
'---es die Daten auslesen kann:
long pMem#,0 = 1234
SendMessage(targetWin&,$0401,0,0) '$0401 = WM_USER + 1
waitinput
'---Aufräumen:
CloseHandle(hFileMap&)
let pMem# = backup&
end
Programm 2:
DEF OpenFileMapping(3) !"KERNEL32","OpenFileMappingA"
DEF MapViewOfFile(5) !"KERNEL32","MapViewOfFile"
DEF CloseHandle(1) "KERNEL32","CloseHandle"
declare name$
declare hFileMap&,backup&,pMem#
dim pMem#,@mul(1024,50) '50 kb
window 100,100-300,200
windowtitle "FileMapping-Client"
'---FileMapping-Objekt erstellen:
let name$ = "-$filemap01"
let hFileMap& = OpenFileMapping(983071,1,Addr(name$))
'---"Datei" in den Speicher abbilden und Ergebnis einer Bereichsvariablen zuweisen:
let backup& = pMem#
let pMem# = MapViewOfFile(hFileMap&,983071,0,0,0) '983071 = FILE_MAP_ALL_ACCESS
UserMessages $0401
while 1
waitinput
if %uMessage
print "Daten gelesen:",@long(pMem#,0)
break
endif
wend
waitinput
'---Aufräumen:
CloseHandle(hFileMap&)
let pMem# = backup&
end
Ich hoffe, ich konnte Dir helfen.
MfG
Sebastian
|