设置命名管道消息模式

本文关键字:消息 模式 管道 设置 | 更新日期: 2023-09-27 18:17:29

我有以下一段代码:

//...
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'失败:结果为false, GetLastError()返回5 (ERROR_ACCESS_DENIED)。除此之外,管道工作得很好-我可以读取和写入数据。当然,除了它不是在消息模式下工作之外。两个WriteFile消息调用的内容由单个ReadFile调用读取。我哪里做错了?

设置命名管道消息模式

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

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

你也没有告诉我们你是如何实现你的NativeMethods的,但是如果你的CreateFile参数直接映射到Win32 CreateFile函数的参数,你只请求FILE_READ_DATAFILE_WRITE_DATA访问权限为你的管道句柄。这些权限不足以允许您调用SetNamedPipeHandleState,这解释了拒绝访问错误。参见Win32 API文档:

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