2009-07-24 120 views
1

我想在托管和非托管过程之间做一些IPC。我已经解决了命名管道问题。CallNamedPipe&NamedPipeServerStream,访问被拒绝?

我纺一个线程在托管代码,使用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(拒绝访问)。任何想法为什么?

回答

1

我的猜测是,你是在两个不同的帐户中运行的进程。由于您使用的是使用默认安全性的NamedPipeStream构造函数,因此其他用户无权访问。这可以通过使用带有PipeSecurity实例的构造函数来解决。然后,只需明确指定其他帐户访问权限。

编辑:我只是注意到,你正在创建管道作为单向管与方向。但我相信CallNamedPipe尝试打开管道读取和写入,并将失败时连接到一个单向的管道,方式管道。

编辑2:此外,该构造函数创建一个字节类型管道和CallNamedPipe只能连接到消息类型管道。所以你必须使用另一个构造函数。

+0

出于测试目的,我试着在相同的过程中运行两个代码路径,达到相同的效果。无论如何,我会研究PipeSecurity。 – 2009-07-24 01:10:33

3

这里是获胜的代码行:

NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.None) 

它应该是双面,即使你使用它仅用于传出数据,

0

有时,当有被拒绝的访问可以被接收很多命名管道的打开和关闭,类似于这里描述的错误: Named Pipe Remoting Exceptions。解决方案似乎是在短暂延迟后重试制作命名管道。