Une classe pour l'utilisation de la mémoire partagée

Contenu du snippet

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

A voir également

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.