一些源实现命名管道通信btw服务应用程序或帮助它

时间:2011-02-03 23:45:14

标签: windows delphi ipc

我正在实现我自己的命名管道客户端/服务器类,但我在网上遇到太多麻烦和信息。 我已经发现很多使用管道的实现但是使用vlc应用程序,但我正在使用服务应用程序。

我也接受有关如何使用管道的提示。

我的实际问题是:  服务器应用程序只是从客户端收到一条消息,此后我的服务器不能再使用PeekNamedPipe()。  我从GetLastError获取的错误消息是“管道的另一端有一个进程”,但是......我不知道该解决什么问题。  如果我关闭客户端应用程序,我收到的消息是“管道正在关闭”,此后我无法建立客户端通信。

tks

3 个答案:

答案 0 :(得分:3)

哦,我发现了这个问题。 我正在阅读一些Windows文章,我发现我必须在偷看后和断开连接后连接到命名管道。有道理。

ConnectNamedPipe(FPipeHandle,nil)和PeekNamedPipe之后(FPipeHandle,nil,0,nil,@ LBytesSize,nil)

完成操作后,我必须调用DisconnectNamedPipe(FPipeHandle); 解放这个过程。

TKS

答案 1 :(得分:1)

我认为在Vista或Seven中运行应用程序时会遇到麻烦。

在XP下,服务和客户端应用程序之间没有通信问题。

但是“感谢”Vista和Seven引入的新UAC和安全策略,您需要设置一些安全参数。

请参阅我们的开源框架的what I found out during implementation and testing

您有一个名为管道客户端和服务器通信的工作示例,也使用作为服务运行的服务器in our source code repository进行了测试。

答案 2 :(得分:1)

您有一些示例代码,请注意您需要在表单上创建的GUI组件:

发件人单位:

procedure TForm1.FormCreate(Sender: TObject);
var
   FSA : SECURITY_ATTRIBUTES;
   FSD : SECURITY_DESCRIPTOR;
   pch1: shortstring;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := sizeof(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe:= CreateNamedPipe(PChar('\\.\pipe\<test>'),
                          PIPE_ACCESS_DUPLEX or FILE_FLAG_WRITE_THROUGH,
                          PIPE_TYPE_MESSAGE or PIPE_READMODE_MESSAGE or PIPE_NOWAIT,
                          PIPE_UNLIMITED_INSTANCES,
                          1024,
                          1024,
                          50,
                          @FSA);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: shortstring;
   dw : dword;
   b1 : boolean;
begin
   buffer:= Edit2.Text;
   WriteFile(Pipe, buffer, sizeof(buffer), dw, nil);
end;

接收单位:

procedure TForm1.FormCreate(Sender: TObject);
var
   FSA : SECURITY_ATTRIBUTES;
   FSD : SECURITY_DESCRIPTOR;
begin
   InitializeSecurityDescriptor(@FSD, SECURITY_DESCRIPTOR_REVISION);
   SetSecurityDescriptorDacl(@FSD, True, nil, False);
   FSA.lpSecurityDescriptor := @FSD;
   FSA.nLength := sizeof(SECURITY_ATTRIBUTES);
   FSA.bInheritHandle := True;

   Pipe:= CreateFile(PChar('\\.\pipe\<test>'),
                     GENERIC_READ or GENERIC_WRITE,
                     0,
                     @FSA,
                     OPEN_EXISTING,
                     0,
                     0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   buffer: shortstring;
   dw : dword;
begin
   ReadFile(Pipe, buffer, sizeof(buffer), dw, nil);
   edit1.Text := buffer;
end;

希望这会有所帮助。