You can also use shared memory through a dll.
Or Budman's shared memory code
without a DLL:
' Simple program to demonstrate sharing memory between process
' compile as console program and run one or more times the first run sets the
' shared memory
' additonal runs read it
SuperStrict
Extern "Win32"
Function CloseHandle:Int(Handle:Int)
Function MapViewOfFile:Byte Ptr(hFileMappingObject: Int,dwDesiredAccess: Int, dwFileOffsetHigh:Int, dwFileOffsetLow:Int, dwNumberOfBytesToMap:Int)
Function UnmapViewOfFile:Int(lpBaseAddress: Byte Ptr)
Function CreateFileMappingA:Int(hFile: Int, lpFileMappingAttributes: Byte Ptr,flProtect:Int, dwMaximumSizeHigh:Int, dwMaximumSizeLow:Int, lpName$z)
Function GetLastError:Int()
End Extern
Const PAGE_READWRITE : Int=4
Const FILE_MAP_WRITE : Int=2
Type TSharedMemory
Field _Handle : Int
Field _Name : String
Field _Size : Int
Field _Owner : Int
Field _Data : Byte Ptr
Method Delete()
Close
End Method
Method Open:Int(Name: String, Size: Int)
Close()
_Name = Name
_Size = Size
' CreateFileMapping, when called with $FFFFFFFF For the hanlde value, creates a region of shared memory }
_Handle = CreateFileMappingA($FFFFFFFF, Null, PAGE_READWRITE, 0,_Size,_Name)
If _Handle = 0 Then Return False
_Owner = GetLastError() = 0
' We still need To map a pointer To the handle of the shared memory region
_Data= MapViewOfFile(_Handle, FILE_MAP_WRITE, 0, 0, _Size)
If Not _Data
Close
Return False
End If
Return True
End Method
Method Close()
If _Data
UnmapViewOfFile(_Data);
_Data=Null
End If
If _Handle
CloseHandle(_Handle)
_Handle=0
End If
End Method
End Type
Print "Test Share Mem"
Local mem:TSharedMemory = New TSharedMemory
mem.Open("TESTMEM",30)
If mem._Owner
MemClear mem._Data,30
Local title:String="Start Blank!"
Local pTitle:Byte Ptr=title.toCString()
MemCopy mem._Data,pTitle,title.length+1
MemFree pTitle
End If
Repeat
If mem._Owner
Print "Getting Title (Owner)"
Local title : String = string.FromCString(mem._Data)
Print "The Title is "+title
GCCollect()
Else
Print "Setting Title (Guest)"
MemClear mem._Data,30
SeedRnd MilliSecs()
Local title:String=Rand(0,100000)
Local pTitle:Byte Ptr=title.toCString()
MemCopy mem._Data,pTitle,title.length+1
MemFree pTitle
GCCollect()
mem.close
End
' Print "Getting Title"
' Local title : String = string.FromCString(mem._Data)
' Print "The Title is "+title
End If
'Input
'Delay 2000
Forever
mem.Close