我正在实现我自己的命名管道客户端/服务器类,但我在网上遇到太多麻烦和信息。 我已经发现很多使用管道的实现但是使用vlc应用程序,但我正在使用服务应用程序。
我也接受有关如何使用管道的提示。
我的实际问题是: 服务器应用程序只是从客户端收到一条消息,此后我的服务器不能再使用PeekNamedPipe()。 我从GetLastError获取的错误消息是“管道的另一端有一个进程”,但是......我不知道该解决什么问题。 如果我关闭客户端应用程序,我收到的消息是“管道正在关闭”,此后我无法建立客户端通信。
tks
答案 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;
希望这会有所帮助。