Delphi 使用管道进程间通讯

发起进程:创建管道,发送数据,接受反馈数据

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;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi中的命名管道是一种用于进程通信的特殊类型的管道。它允许不同的进程通过读写共享的命名管道来进行数据交换。 在Delphi中创建命名管道需要使用Windows API函数来操作。首先,需要使用`CreateNamedPipe`函数创建一个命名管道,该函数会返回一个管道句柄。这个管道句柄可以用于后续的读写操作。 在命名管道创建成功后,可以使用`ConnectNamedPipe`函数来等待其他进程连接到该管道。一旦有其他进程连接到管道,就可以使用`ReadFile`和`WriteFile`函数来进行数据读取和写入操作。 另一方面,如果想让当前进程连接到一个已经存在的命名管道,可以使用`CreateFile`函数来打开该管道,并获取到一个文件句柄。然后就可以使用`ReadFile`和`WriteFile`函数进行数据的交互。 在使用完命名管道后,需要使用`DisconnectNamedPipe`函数来断开当前进程管道的连接,并使用`CloseHandle`函数关闭管道的句柄。 需要注意的是,命名管道是一种同步的通信方式,即读操作会阻塞当前进程直到有数据可读,写操作也会阻塞当前进程直到数据成功写入。因此,在使用命名管道时,需要考虑到这种同步机制对程序的影响。 总之,Delphi中的命名管道提供了一种方便的进程通信的机制,可以通过读写共享的命名管道来进行数据交换。通过使用相关的Windows API函数,可以在Delphi中轻松地创建、连接和使用命名管道
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值