我有以下代码:
//...
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消息调用的内容。我在这里做错了什么?
答案 0 :(得分:1)
CreateFile
打开已由其他充当管道服务器的其他人创建的命名管道的客户端。您不会在问题中告诉我们您的管道是如何创建的。如果管道服务器创建管道时PipeMode
被指定为PIPE_TYPE_MESSAGE
,则管道将仅在消息模式下工作。
如果在消息模式下创建管道,则管道客户端可以选择是以消息模式还是以字节模式读取。如果管道没有处于消息模式,管道客户端不会尝试将读取模式设置为消息(PIPE_READMODE_MESSAGE
)将会产生任何影响,因为它不会更改管道模式。 / p>
您也没有向我们展示您是如何实现NativeMethods
的,但是如果您的CreateFile
参数直接映射到Win32 CreateFile
函数的参数,那么仅请求管道句柄的FILE_READ_DATA
和FILE_WRITE_DATA
访问权限。这些权限不足以让您调用SetNamedPipeHandleState
,这解释了访问被拒绝错误。见the Win32 API documentation:
句柄必须具有对命名管道的GENERIC_WRITE访问权限 只写或读/写管道,或者必须有GENERIC_READ和 FILE_WRITE_ATTRIBUTES访问只读管道。