我正在尝试在托管和非托管进程之间进行一些IPC。我已经确定了命名管道。
我正在使用NamedPipeServerStream:
在托管代码中启动一个帖子using (NamedPipeServerStream stream = new NamedPipeServerStream("MyPipe", PipeDirection.In))
{
while (true)
{
stream.WaitForConnection();
stream.Read(buffer, 0, size);
//Handle buffer values
}
}
在非管理方面,我正在使用CallNamedPipe:
CallNamedPipe(TEXT("\\\\.\\pipe\\MyPipe"), NULL, 0, pData, dataSize, NULL, NMPWAIT_WAIT_FOREVER);
但是,CallNamedPipe失败,GetLastError为5(拒绝访问)。知道为什么吗?
答案 0 :(得分:3)
这是获胜的代码行:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None)
它应该是双面的,即使您只将其用于传出数据
答案 1 :(得分:1)
我的猜测是你在两个不同的帐户下运行流程。由于您使用的是使用默认安全性的NamedPipeStream构造函数,因此其他用户无权访问。这可以通过使用带有PipeSecurity实例的构造函数来解决。然后明确地给予其他帐户访问权限。
编辑:我刚刚注意到你正在创建Pipe作为方向输入的单向管道。但我相信CallNamedPipe尝试打开管道进行读写,并且在连接到单向时会失败管。编辑2:此构造函数还创建一个字节类型管道,而CallNamedPipe只能连接到消息类型管道。所以你必须使用另一个构造函数。
答案 2 :(得分:0)
当有大量打开和关闭命名管道时,有时可能会收到拒绝访问,类似于此处描述的错误: Named Pipe Remoting Exceptions。解决方案似乎是在短暂的延迟后重试命名管道。