1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| type TDataPackage = class (TObject) private protected public Data : TMemoryStream; Command : String; end;
TServerThread = class(TThread) private FCount: Integer; FPipe: THandle; protected procedure Execute; override; public destructor Destroy; end;
implementation
destructor TServerThread.Destroy; begin if DisconnectNamedPipe(FPipe) then CloseHandle(FPipe); inherited Destroy; end;
procedure TServerThread.Execute; var fConnected, fSuccess: LongBool; dRequest, dReply: TDataPackage; lb: byte absolute dRequest; dwThreadID, cbBytesRead, cbReplyBytes, cbWritten: DWord; const PipeName :PChar = '\\.\pipe\DataPipe'+ #0 ;
begin FCount:= 0; while true do begin FPipe := CreateNamedPipe(PipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_Message or PIPE_READMODE_Byte or PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 225, 255, NMPWAIT_USE_DEFAULT_WAIT, nil); if (FPipe <> INVALID_HANDLE_VALUE) then fConnected := ConnectNamedPipe(FPipe, nil); if (fConnected) then begin dReply := TDataPackage.Create; dReply.Data := TMemoryStream.Create; dRequest := TDataPackage.Create; dRequest.Data := TMemoryStream.Create;
inc(FCount); fSuccess := ReadFile(FPipe, dRequest, sizeof(dRequest), cbBytesRead, Nil); dRequest.Data.SaveToFile('C:\Test.xxx'); if (Copy(dRequest.Command, 1, Length('OPEN'))='OPEN') then begin dReply.Command:='do Open'; dRequest.Data.SaveToFile('C:\Test.xxx'); end; fSuccess := WriteFile(FPipe, dReply, sizeof(dReply), cbWritten, nil); FlushFileBuffers(FPipe); DisconnectNamedPipe(FPipe); CloseHandle(FPipe); end; end; end; |