Sharing array() between exe

Share your advanced PureBasic knowledge/code with the community.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Sharing array() between exe

Post by Kwai chang caine »

Hello at all :D

Today it's not christmas but nearly
KCC dare to show to you, his code for sharing arrays between exe :oops:
Little KCC need your MASTER advice for know if it's a good way for do that (Do not strike too hard on the head :| )

My goal ?? create a little library, the more simple possible, for do the job

Thanks to BISONTE i have learning the FileMapping 8)
And Thanks to LUNASOLE, i have a magical MACRO for simplify the sending of the array to the procedure 8)

KCC advice before read.....take an aspirin :mrgreen:

Image

Code: Select all

; Array Shared by KCC
; Thanks to BISONTE for the FileMapping solution and LUNASOLE for his splendid MACRO

Structure Arrays
 Name.s
 Value.l
 Size.l
EndStructure

Global Var.Arrays

Macro DQuote
 "
EndMacro

Macro ShareArray_Init(v)
 Var\Name = DQuote#@v#DQuote
 Var\Value = @v
 Var\Size = ArraySize(v)
EndMacro

Procedure ShareArray_Write()
  
 If FindString(Var\Name, "$") Or FindString(Var\Name, ".s", #PB_String_NoCase)
  
  Dim ArrayTemp.s(Var\Size)
  CopyMemory(Var\Value, @ArrayTemp(), (Var\Size + 1) * SizeOf(Long))
 
  For i = 1 To Var\Size
   SentenceArray$ + ArrayTemp(i) + "|"
  Next

  LenData = Len(SentenceArray$)
  Type = #PB_String
  
 Else
  
  LenData = (Var\Size + 1) * SizeOf(Long) 
  Type = #PB_Long
  
 EndIf
  
 hFileMap = CreateFileMapping_(#INVALID_HANDLE_VALUE ,#Null, #PAGE_READWRITE, 0, LenData, Var\Name)
 
 If Not hFileMap
  MessageRequester("Error", "Impossible to create shared memory")
  ProcedureReturn #False
 EndIf
 
 If GetLastError_() <> #ERROR_ALREADY_EXISTS
 
  hFileMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, Var\Name)
 
  If hFileMap
  
   *PtrDatas = MapViewOfFile_(hFileMap, #FILE_MAP_WRITE, 0, 0, 0)
   
   Select Type
    Case #PB_String
     PokeS(*PtrDatas, SentenceArray$)
     FreeArray(ArrayTemp())
    Case #PB_Long
     CopyMemory(Var\Value, *PtrDatas, LenData)
   EndSelect
   
  EndIf
  
 EndIf 
 
 ProcedureReturn hFileMap
 
EndProcedure

Procedure ShareArray_Read()
  
 hFileMap = OpenFileMapping_(#FILE_MAP_ALL_ACCESS, 0, Var\Name)
  
 If hFileMap
 
  *PtrDatas = MapViewOfFile_(hFileMap, #FILE_MAP_WRITE, 0, 0, 0)
  
  If *PtrDatas
   ProcedureReturn *PtrDatas
  EndIf 
 
 EndIf 

EndProcedure

Procedure ShareArray_Close(hFileMap)

 CloseHandle_(hFileMap)
 Var\Name = ""
 Var\Value = 0
 Var\Size = 0
 
EndProcedure

; ******************************************************************
;      TEST (Run one time...or two time for have another EXE)
; ******************************************************************

; Loading array of string
Dim ArrayString.s(10)

For i = 1 To 10
 ArrayString(i) = "Kcc n° " + Trim(Str(i))
Next

; Manage of sharing
ShareArray_Init(ArrayString.s())
hFileMap = ShareArray_Write()
*PtrArray = ShareArray_Read()
SentenceArray$ = PeekS(*PtrArray)

; Read return of sharing
For i = 1 To Var\Size
 Debug StringField(SentenceArray$, i, "|")
Next

ShareArray_Close(hFileMap)

; Loading array of Long
Dim TabloLong.l(10)

For i = 1 To 10
 TabloLong(i) = i
Next

; Manage sharing of array long
ShareArray_Init(TabloLong.l())
hFileMap = ShareArray_Write()
*PtrArray = ShareArray_Read()

; Read return of sharing
Dim ArrayTemp.l(Var\Size)
CopyMemory(*PtrArray, @ArrayTemp(), (Var\Size + 1) * SizeOf(Long))

For i = 1 To Var\Size
 Debug ArrayTemp(i)
Next

ShareArray_Close(hFileMap)
FreeArray(ArrayTemp())

Repeat : Delay(1) :Until GetAsyncKeyState_(#VK_ESCAPE)
Have a good day
ImageThe happiness is a road...
Not a destination