unit uTICSharedMemory; {$mode ObjFPC}{$H+} interface uses Windows; type { TTICSharedMemory } TTICSharedMemory = class private FPointer: Pointer; FLastError: DWord; FHandle: THandle; procedure FreeHandle; public // AName = l'identifiant du fichier partagé en mémoire // ASize = la taille totale des données partagées constructor Create(AName: PChar; ASize: integer); destructor Destroy; override; property LastError: DWord read FLastError; // Pointer = l'adresse de la donnée partagée property Pointer: pointer read FPointer; end; implementation { TTICSharedMemory } procedure TTICSharedMemory.FreeHandle; begin if FHandle <> 0 then begin CloseHandle(FHandle); FHandle := 0; end; end; constructor TTICSharedMemory.Create(AName: PChar; ASize: integer); begin FHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, ASize, AName); FLastError := GetLastError; if FHandle > 0 then begin FPointer := MapViewOfFile(FHandle, FILE_MAP_WRITE, 0, 0, 0); if not assigned(FPointer) then FreeHandle; end; end; destructor TTICSharedMemory.Destroy; begin if assigned(FPointer) then begin UnmapViewOfFile(FPointer); FPointer := nil; end; FreeHandle; inherited; end; end.