发起进程:创建管道,发送数据,接受反馈数据
Const
PipeName = '\\.\pipe\Test';
PipeSize = 1000;
PipeTimeOut = 3000;
procedure PipeServer();
var
Se:TSecurityAttributes;
SPipeHandle:THandle;
Buffer:Pchar;
WriteBuffer:DWORD;
begin
Se.nLength:=Sizeof(TSecurityAttributes);
Se.lpSecurityDescriptor:=nil;
Se.bInheritHandle:=True;
SPipeHandle:=CreateNamedPipe(PipeName,
PIPE_ACCESS_DUPLEX OR FILE_FLAG_WRITE_THROUGH,
PIPE_TYPE_BYTE or PIPE_WAIT,
1,PipeSize,PipeSize,PipeTimeOut,@Se);
Buffer:=AllocMem(1000);
if SPipeHandle<> 0 then
begin
while True do
begin
if ConnectNamedPipe(SPipeHandle,nil) then
begin
Buffer:=PChar(IntToStr(GetTickCount));
//写入数据
WriteFile(SPipeHandle,Buffer[0],Length(Buffer),WriteBuffer,nil);
Sleep(500);
//等待反馈数据
ReadFile(SPipeHandle,Buffer[0],PipeSize,WriteBuffer,nil);
DisConnectNamedPipe(SPipeHandle);
end;
Sleep(2000);
end;
CloseHandle(SPipeHandle);
end;
FreeMemory(Buffer);
end;
监听进程:接受数据,反馈数据
Const
PipeName = '\\.\pipe\Test';
PipeSize = 1000;
procedure PipeClient();
var
Buffer:Array [0..1000] of Char;
Requst:PChar;
ReadSize:DWORD;
hPipe:Thandle;
begin
while True do
begin
if WaitNamedPipe(PipeName,NMPWAIT_WAIT_FOREVER) then
begin
hPipe:=CreateFile(PipeName,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE,NiL,
OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE or FILE_FLAG_WRITE_THROUGH, 0);
if hPipe <> INVALID_HANDLE_VALUE then
begin
ReadSize:=0;
ReadFile(hPipe,Buffer[0],PipeSize,ReadSize,nil);
if ReadSize > 0 then
begin
//收到数据
Requst:= Pchar(Format('%s OK',[Buffer]));
//写入反馈
WriteFile(hPipe,Requst[0],Length(Requst),ReadSize,nil);
end;
CloseHandle(hPipe);
end;
end;
end;
end;