Permet de définir par un nom une zone mémoire qui pourra être ensuite partagée entre plusieurs applications.
Source / Exemple :
- !* Objet : Utilisation de la mémoire partagée pour la communication entre applications
- !* Auteur : C.Chenavier
- !* Version : 1.00 - 20/01/2005
- !*
- !* Exemple d'utilisation :
- !*
- !* oSharedMem = CREATEOBJECT("SharedMemory", "Nom_de_partage")
- !* oSharedMem.Write("ceci est la chaîne à transférer")
- !*
- !* Application 2 :
- !* oSharedMem = CREATEOBJECT("SharedMemory", "Nom_de_partage")
- !* MessageBox(oSharedMem.Read())
- !*
- !* Note : par défaut le buffer est de 4Ko.
- !* Pour le passer par exemple à 32K faire :
- !* oSharedMem = CREATEOBJECT("SharedMemory", "Nom_de_partage", 32*1024)
#DEFINE INVALID_HANDLE_VALUE -1
#DEFINE PAGE_READWRITE 0x04
#DEFINE SECTION_QUERY 0x0001
#DEFINE SECTION_MAP_WRITE 0x0002
#DEFINE SECTION_MAP_READ 0x0004
#DEFINE SECTION_MAP_EXECUTE 0x0008
#DEFINE SECTION_EXTEND_SIZE 0x0010
#DEFINE STANDARD_RIGHTS_REQUIRED 0x000F0000
#DEFINE SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED+SECTION_QUERY+;
SECTION_MAP_WRITE + ;
SECTION_MAP_READ + ;
SECTION_MAP_EXECUTE + ;
SECTION_EXTEND_SIZE)
DEFINE CLASS SharedMemory AS CUSTOM
hMapFile = 0
cSharedName = ''
HIDDEN Buf_Size
Buf_Size = 4*1024
PROCEDURE Init
LPARAMETERS cSharedName, nSize
LOCAL nLibs
LOCAL ARRAY aLibs(1,3)
THIS.Name = SYS(2015)
THIS.cSharedName = IIF(EMPTY(M.cSharedName), '', M.cSharedName)
M.nLibs = ADLLS(aLibs)
IF ASCAN(aLibs,"CreateFileMapping",1,0,1,7)=0
DECLARE INTEGER CreateFileMapping IN kernel32 ;
INTEGER hFile, ;
INTEGER lpAttributes, ;
INTEGER flProtect, ;
LONG dwMaximumSizeHi, ;
LONG dwMaximumSizeLo, ;
STRING lpName
DECLARE INTEGER OpenFileMapping IN kernel32 ;
INTEGER flProtect, ;
INTEGER wInherit, ;
STRING lpName
DECLARE LONG MapViewOfFile IN kernel32 ;
INTEGER hFileMappingObject, ;
INTEGER dwDesiredAccess, ;
LONG dwFileOffsetHi, ;
LONG dwFileOffsetLo, ;
LONG dwNumberOfBytesToMap
DECLARE INTEGER UnmapViewOfFile IN kernel32;
LONG lpBaseAddress
ENDIF
IF ASCAN(aLibs,"CloseHandle",1,0,1,7)=0
DECLARE INTEGER CloseHandle IN kernel32;
INTEGER hObject
ENDIF
IF NOT THIS.Open()
THIS.New(M.nSize)
ENDIF
ENDPROC
FUNCTION New
LPARAMETERS nSize
IF NOT EMPTY(M.nSize)
THIS.Buf_Size = M.nSize
ENDIF
THIS.hMapFile = CreateFileMapping( ;
INVALID_HANDLE_VALUE, ;
0, ;
PAGE_READWRITE, ;
0, ;
THIS.Buf_Size, ;
THIS.cSharedName)
RETURN (THIS.hMapFile > 0)
ENDPROC
FUNCTION Open
THIS.hMapFile = OpenFileMapping( ;
SECTION_ALL_ACCESS, ;
0, ;
THIS.cSharedName)
RETURN (THIS.hMapFile > 0)
ENDPROC
FUNCTION Read
LOCAL pBuf, cString
M.cString = ''
IF THIS.hMapFile > 0
pBuf = MapViewOfFile(THIS.hMapFile, ;
SECTION_ALL_ACCESS, ;
0, 0, THIS.Buf_Size)
IF pBuf > 0
M.cString = SYS(2600, pBuf, THIS.Buf_Size)
UnmapViewOfFile(pBuf)
ENDIF
ENDIF
RETURN M.cString
ENDPROC
FUNCTION Write
LPARAMETERS cString
LOCAL nStringLen, pBuf, lOK
IF THIS.hMapFile > 0
M.cString = M.cString + CHR(0)
M.nStringLen = MIN(LEN(M.cString), THIS.Buf_Size)
pBuf = MapViewOfFile(THIS.hMapFile, ;
SECTION_ALL_ACCESS, ;
0, 0, THIS.Buf_Size)
IF pBuf > 0
SYS(2600, pBuf, M.nStringLen, M.cString)
UnmapViewOfFile(pBuf)
M.lOK = .T.
ENDIF
ENDIF
RETURN M.lOK
ENDPROC
PROCEDURE Destroy
IF THIS.hMapFile > 0
CloseHandle(THIS.hMapFile)
ENDIF
ENDPROC
ENDDEFINE
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.