Advertisement
Guest User

Untitled

a guest
Nov 16th, 2011
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 8.21 KB | None | 0 0
  1. unit IPCSharedMemory;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Classes;
  7.  
  8. const
  9.   IPC_STRINGS_MAX    = 100;
  10.  
  11. type
  12.   {$M+}
  13.   TIPCSharedMemory = class;
  14.   {$M-}
  15.  
  16.   TIPCHeader = record
  17.                  StringSizes : Array[0..IPC_STRINGS_MAX - 1] of Integer;
  18.                end;
  19.  
  20.   TSignalListenerThread = class(TThread)
  21.                           private
  22.                             FString : String;
  23.                             FIPC    : TIPCSharedMemory;
  24.  
  25.                             procedure Synchronization;
  26.                           protected
  27.                             procedure Execute; override;
  28.                           public
  29.                             constructor Create;
  30.                             destructor Destroy; override;
  31.                           end;
  32.  
  33.   TOnReceiveString = procedure(const AString : String) of object;
  34.  
  35.   {$M+}
  36.   TIPCSharedMemory = class
  37.                      private
  38.                        FHMapping            : THandle;
  39.                        FHSignal1, FHSignal2 : THandle;
  40.                        FMapName             : String;
  41.                        FBufferSize          : DWORD;
  42.                        FListening           : Boolean;
  43.                        FSignalThread        : TSignalListenerThread;
  44.  
  45.                        FOnReceiveString : TOnReceiveString;
  46.  
  47.                        function IsInitialized : Boolean;
  48.                        function GetStringCount : Integer;
  49.                      public
  50.                        constructor Create;
  51.                        destructor Destroy; override;
  52.  
  53.                        function Open(const AMapName : String; const ABufferSize : DWORD; var AAlreadyExists : Boolean) : Integer;
  54.                        procedure Close;
  55.                        function ClearMemory : Integer;
  56.                        function WriteString(const AString : String) : Integer;
  57.                        function ReadLastString : String;
  58.                        function RemoveLastString : Integer;
  59.                      published
  60.                        property HMapping        : THandle read FHMapping;
  61.                        property HSignal1        : THandle read FHSignal1;
  62.                        property HSignal2        : THandle read FHSignal2;
  63.                        property Initialized     : Boolean read IsInitialized;
  64.                        property StringCount     : Integer read GetStringCount;
  65.                        property Listening       : Boolean read FListening;
  66.                        property SignalThread    : TSignalListenerThread read FSignalThread;
  67.                        property OnReceiveString : TOnReceiveString read FOnReceiveString write FOnReceiveString;
  68.                      end;
  69.   {$M-}
  70.  
  71. implementation
  72.  
  73. uses
  74.   SharedFunctions;
  75.  
  76. procedure TSignalListenerThread.Synchronization;
  77. begin
  78.   If Assigned(FIPC.OnReceiveString) Then
  79.     FIPC.OnReceiveString(FString);
  80. end;
  81.  
  82. procedure TSignalListenerThread.Execute;
  83. begin
  84.   repeat
  85.     SetEvent(FIPC.FHSignal1);
  86.     WaitForSingleObject(FIPC.FHSignal2, INFINITE);
  87.  
  88.     While FIPC.StringCount > 0 do
  89.     Begin
  90.       FString := FIPC.ReadLastString;
  91.       FIPC.RemoveLastString;
  92.       Synchronize(Synchronization);
  93.     End;
  94.   until Terminated;
  95. end;
  96.  
  97. constructor TSignalListenerThread.Create;
  98. begin
  99.   inherited Create(TRUE);
  100.  
  101.   FreeOnTerminate := TRUE;
  102. end;
  103.  
  104. destructor TSignalListenerThread.Destroy;
  105. begin
  106.   inherited;
  107. end;
  108.  
  109. constructor TIPCSharedMemory.Create;
  110. begin
  111.   FHMapping := 0;
  112.   FSignalThread := TSignalListenerThread.Create;
  113.   FSignalThread.FIPC := self;
  114. end;
  115.  
  116. destructor TIPCSharedMemory.Destroy;
  117. begin
  118.   Close;
  119.  
  120.   If not FSignalThread.Terminated Then
  121.     FSignalThread.Terminate;
  122.  
  123.   inherited;
  124. end;
  125.  
  126. function TIPCSharedMemory.IsInitialized : Boolean;
  127. begin
  128.   result := FHMapping <> 0;
  129. end;
  130.  
  131. function TIPCSharedMemory.Open(const AMapName : String; const ABufferSize : DWORD; var AAlreadyExists : Boolean) : Integer;
  132. begin
  133.   FHMapping := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TIPCHeader) + ABufferSize, PWideChar(AMapName));
  134.   If FHMapping = 0 Then
  135.     result := GetLastError
  136.   else
  137.   Begin
  138.     AAlreadyExists := GetLastError = ERROR_ALREADY_EXISTS;
  139.     ClearMemory;
  140.     FHSignal1 := CreateEvent(nil, FALSE, FALSE, 'Global\DarerIPCSignal1');
  141.     FHSignal2 := CreateEvent(nil, FALSE, FALSE, 'Global\DarerIPCSignal2');
  142.     FMapName := AMapName;
  143.     FBufferSize := SizeOf(TIPCHeader) + ABufferSize;
  144.     result := 0;
  145.   End;
  146. end;
  147.  
  148. procedure TIPCSharedMemory.Close;
  149. begin
  150.   If IsInitialized Then
  151.   Begin
  152.     CloseHandle(FHMapping);
  153.     CloseHandle(FHSignal1);
  154.     CloseHandle(FHSignal2);
  155.   End;
  156. end;
  157.  
  158. function TIPCSharedMemory.ClearMemory : Integer;
  159. var
  160.   hMapView  : pointer;
  161.   IPCHeader : TIPCHeader;
  162. begin
  163.   result := -1;
  164.   If IsInitialized Then
  165.   Begin
  166.     hMapView := MapViewOfFile(FHMapping, FILE_MAP_ALL_ACCESS, 0, 0, FBufferSize);
  167.     If Assigned(hMapView) Then
  168.     Begin
  169.       FillChar(IPCHeader, SizeOf(TIPCHeader), #0);
  170.       CopyMemory(hMapView, @IPCHeader, SizeOf(TIPCHeader));
  171.       UnmapViewOfFile(hMapView);
  172.       result := ERROR_SUCCESS;
  173.     End;
  174.   End
  175.   else
  176.     result := GetLastError;
  177. end;
  178.  
  179. function TIPCSharedMemory.GetStringCount : Integer;
  180. var
  181.   hMapView  : pointer;
  182.   IPCHeader : TIPCHeader;
  183.   C1        : Integer;
  184. begin
  185.   result := -1;
  186.   If IsInitialized Then
  187.   Begin
  188.     hMapView := MapViewOfFile(FHMapping, FILE_MAP_ALL_ACCESS, 0, 0, FBufferSize);
  189.     If Assigned(hMapView) Then
  190.     Begin
  191.       CopyMemory(@IPCHeader, hMapView, SizeOf(TIPCHeader));
  192.  
  193.       For C1 := 0 to IPC_STRINGS_MAX - 1 Do
  194.         If IPCHeader.StringSizes[C1] = 0 Then
  195.         Begin
  196.           result := C1;
  197.           Break;
  198.         End;
  199.  
  200.       UnmapViewOfFile(hMapView);
  201.     End;
  202.   End;
  203. end;
  204.  
  205. function TIPCSharedMemory.WriteString(const AString : String) : Integer;
  206. var
  207.   hMapView   : pointer;
  208.   hMapViewEx : pointer;
  209.   IPCHeader  : TIPCHeader;
  210.   C1         : Integer;
  211. begin
  212.   result := -1;
  213.   If IsInitialized Then
  214.   Begin
  215.     hMapView := MapViewOfFile(FHMapping, FILE_MAP_ALL_ACCESS, 0, 0, FBufferSize);
  216.     If Assigned(hMapView) Then
  217.     Begin
  218.       WaitForSingleObject(FHSignal1, INFINITE);
  219.       CopyMemory(@IPCHeader, hMapView, SizeOf(TIPCHeader));
  220.       IPCHeader.StringSizes[StringCount] := Length(AString);
  221.       CopyMemory(hMapView, @IPCHeader, SizeOf(TIPCHeader));
  222.  
  223.       hMapViewEx := IncPointer(hMapView, SizeOf(TIPCHeader));
  224.       For C1 := 0 to StringCount - 2 Do
  225.         hMapViewEx := IncPointer(hMapViewEx, IPCHeader.StringSizes[C1] * SizeOf(Char));
  226.       CopyMemory(hMapViewEx, PChar(AString), Length(AString) * SizeOf(Char));
  227.       UnmapViewOfFile(hMapView);
  228.       result := ERROR_SUCCESS;
  229.       SetEvent(FHSignal2);
  230.     End;
  231.   End
  232.   else
  233.     result := GetLastError;
  234. end;
  235.  
  236. function TIPCSharedMemory.ReadLastString : String;
  237. var
  238.   hMapView   : pointer;
  239.   hMapViewEx : pointer;
  240.   IPCHeader  : TIPCHeader;
  241.   C1         : Integer;
  242. begin
  243.   result := '';
  244.   If IsInitialized Then
  245.   Begin
  246.     hMapView := MapViewOfFile(FHMapping, FILE_MAP_ALL_ACCESS, 0, 0, FBufferSize);
  247.     If Assigned(hMapView) Then
  248.     Begin
  249.       CopyMemory(@IPCHeader, hMapView, SizeOf(TIPCHeader));
  250.  
  251.       hMapViewEx := IncPointer(hMapView, SizeOf(TIPCHeader));
  252.       If StringCount > 0 Then
  253.       Begin
  254.         For C1 := 0 to StringCount - 2 Do
  255.           hMapViewEx := IncPointer(hMapViewEx, IPCHeader.StringSizes[C1] * SizeOf(Char));
  256.         SetLength(result, IPCHeader.StringSizes[StringCount - 1]);
  257.         CopyMemory(@result[1], hMapViewEx, Length(result) * SizeOf(Char));
  258.       End;
  259.       UnmapViewOfFile(hMapView);
  260.     End;
  261.   End;
  262. end;
  263.  
  264. function TIPCSharedMemory.RemoveLastString : Integer;
  265. var
  266.   hMapView  : pointer;
  267.   IPCHeader : TIPCHeader;
  268. begin
  269.   result := -1;
  270.   If IsInitialized Then
  271.   Begin
  272.     hMapView := MapViewOfFile(FHMapping, FILE_MAP_ALL_ACCESS, 0, 0, FBufferSize);
  273.     If Assigned(hMapView) Then
  274.     Begin
  275.       CopyMemory(@IPCHeader, hMapView, SizeOf(TIPCHeader));
  276.       If StringCount > 0 Then
  277.       Begin
  278.         IPCHeader.StringSizes[StringCount - 1] := 0;
  279.         CopyMemory(hMapView, @IPCHeader, SizeOf(TIPCHeader));
  280.       End;
  281.       UnmapViewOfFile(hMapView);
  282.       result := ERROR_SUCCESS;
  283.     End;
  284.   End
  285.   else
  286.     result := GetLastError;
  287. end;
  288.  
  289. end.
  290.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement