CallNamedPipe& NamedPipeServerStream,访问被拒绝?

时间:2009-07-24 01:00:27

标签: c# c++ winapi pipe

我正在尝试在托管和非托管进程之间进行一些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(拒绝访问)。知道为什么吗?

3 个答案:

答案 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。解决方案似乎是在短暂的延迟后重试命名管道。