We don't display ads so we rely on your Bitcoin donations to 1KWEk9QaiJb2NwP5YFmR24LyUBa4JyuKqZ
Post date: May 30, 2010 11:45:03 PM
In computing, Inter-process communication (IPC) is a set of techniques for the exchange of data among multiple threads in one or more processes. Processes may be running on one or more computers connected by a network. IPC techniques are divided into methods for message passing, synchronization, shared memory, and remote procedure calls (RPC). The method of IPC used may vary based on the bandwidth and latency of communication between the threads, and the type of data being communicated.
Read more: http://en.wikipedia.org/wiki/Inter-process_communication
This unit, written by Alice, enables you to perform inter-process communication.
Unit:
unit ipc;//By Aliceinterfaceuses Windows;type TIpc = record Status: Cardinal; ReportName: Array [0..255] of Char; end; PIpc = ^TIpc;const IPC_SCRIPT_WRITTEN = $0001; IPC_REPORT_WRITTEN = $0002; IPC_SCRIPT_READ = $0004; IPC_REPORT_READ = $0008;function ipcReadScript(Name: String): String;function ipcWriteScript(Name, Value: String): Boolean;function ipcReadReportHeader(Name: String): String;function ipcReadReport(Name: String): String;function ipcWriteReportHeader(Name, ReportName: String): Boolean;function ipcWriteReport(Name, Value: String): Boolean;function ipcSetStatus(Name: String; Status: Cardinal): Boolean;function ipcGetStatus(Name: String): Cardinal;implementationfunction ipcCreateFileMap(Name: String; MapSize: Cardinal): Cardinal;begin Result := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, MapSize, PChar(Name));end;function ipcReadScript(Name: String): String;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := ''; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try if (lpIpc^.Status = IPC_SCRIPT_WRITTEN) then Result := PChar(Integer(lpIpc) + SizeOf(TIpc)); except end; end;end;function ipcWriteScript(Name, Value: String): Boolean;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := False; hFileMap := ipcCreateFileMap(Name, SizeOf(TIpc) + Length(Value) + 1); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try lpIpc^.Status := IPC_SCRIPT_WRITTEN; lpIpc^.ReportName := ''; CopyMemory(Ptr(Integer(lpIpc) + SizeOf(TIpc)), PChar(Value), Length(Value) + 1); Result := True; except end; end;end;function ipcReadReportHeader(Name: String): String;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := ''; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try if (lpIpc^.Status = IPC_REPORT_WRITTEN) then Result := lpIpc^.ReportName; except end; end;end;function ipcReadReport(Name: String): String;var lpReport: PChar; hFileMap: Cardinal;begin Result := ''; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpReport := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpReport <> nil) then begin try Result := String(lpReport); except end; end;end;function ipcWriteReportHeader(Name, ReportName: String): Boolean;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := False; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try CopyMemory(@lpIpc^.ReportName[0], PChar(ReportName), Length(ReportName) + 1); Result := True; except end; end;end;function ipcWriteReport(Name, Value: String): Boolean;var lpReport: PChar; hFileMap: Cardinal;begin Result := False; hFileMap := ipcCreateFileMap(Name, Length(Value) + 1); if (hFileMap = 0) then Exit; lpReport := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpReport <> nil) then begin try CopyMemory(lpReport, PChar(Value), Length(Value) + 1); Result := True; except end; end;end;function ipcSetStatus(Name: String; Status: Cardinal): Boolean;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := False; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try lpIpc^.Status := Status; Result := True; except end; end;end;function ipcGetStatus(Name: String): Cardinal;var lpIpc: PIpc; hFileMap: Cardinal;begin Result := 0; hFileMap := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, PChar(Name)); if (hFileMap = 0) then Exit; lpIpc := MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); if (lpIpc <> nil) then begin try Result := lpIpc^.Status; except end; end;end;end.Usage:
function TF_WriteScript(P: Pointer): Cardinal; stdcall;var ReportName: String;begin Result := 0; ipcWriteScript('Script1', Form1.Memo1.Lines.Text); while (ipcGetStatus('Script1') <> IPC_REPORT_WRITTEN) do Sleep(1000); ReportName := ipcReadReportHeader('Script1'); if (ReportName = '') then Exit; Form1.Memo1.Lines.Text := ipcReadReport(ReportName); ipcSetStatus('Script1', IPC_REPORT_READ); MessageBox(0, 'WriteScript', '', MB_OK);end;function TF_ReadScript(P: Pointer): Cardinal; stdcall;begin Result := 0; Form1.Memo1.Lines.Text := ipcReadScript('Script1'); ipcSetStatus('Script1', IPC_SCRIPT_READ); if not (ipcWriteReportHeader('Script1', 'Report1')) then Exit; ipcWriteReport('Report1', 'String copied to Form successfully!!'); ipcSetStatus('Script1', IPC_REPORT_WRITTEN); while (ipcGetStatus('Script1') <> IPC_REPORT_READ) do Sleep(1000); MessageBox(0, 'ReadScript', '', MB_OK);end;procedure TForm1.Button1Click(Sender: TObject);var lpThreadId: Cardinal;begin CreateThread(nil, 0, @TF_WriteScript, nil, 0, lpThreadId);end;procedure TForm1.Button2Click(Sender: TObject);var lpThreadId: Cardinal;begin CreateThread(nil, 0, @TF_ReadScript, nil, 0, lpThreadId);end;