设置命名管道消息模式

时间:2013-06-09 14:10:10

标签: c# .net-2.0 pipe named-pipes

我有以下代码:

//...
SafeFileHandle handle = NativeMethods.CreateFile(pipeName, FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
if (handle.IsInvalid)
    continue;
uint mode = (uint)PipeMode.ReadModeMessage; // mode==2
bool result = NativeMethods.SetNamedPipeHandleState(handle, ref mode, IntPtr.Zero, IntPtr.Zero);
//...

问题是对'SetNamedPipeHandleState'的调用失败:result为false,GetLastError()返回5(ERROR_ACCESS_DENIED)。除此之外管道工作得很好 - 我可以读写数据。当然,除了它不在消息模式下工作 - 例如。单个ReadFile调用读取两个WriteFile消息调用的内容。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

CreateFile打开已由其他充当管道服务器的其他人创建的命名管道的客户端。您不会在问题中告诉我们您的管道是如何创建的。如果管道服务器创建管道时PipeMode被指定为PIPE_TYPE_MESSAGE,则管道将仅在消息模式下工作。

如果在消息模式下创建管道,则管道客户端可以选择是以消息模式还是以字节模式读取。如果管道没有处于消息模式,管道客户端不会尝试将读取模式设置为消息(PIPE_READMODE_MESSAGE)将会产生任何影响,因为它不会更改管道模式。 / p>

您也没有向我们展示您是如何实现NativeMethods的,但是如果您的CreateFile参数直接映射到Win32 CreateFile函数的参数,那么仅请求管道句柄的FILE_READ_DATAFILE_WRITE_DATA访问权限。这些权限不足以让您调用SetNamedPipeHandleState,这解释了访问被拒绝错误。见the Win32 API documentation

  

句柄必须具有对命名管道的GENERIC_WRITE访问权限   只写或读/写管道,或者必须有GENERIC_READ和   FILE_WRITE_ATTRIBUTES访问只读管道。

相关问题