1

我有以下代码:

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

4

1 回答 1

1

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

如果管道是以消息方式创建的,那么管道客户端可以选择是以消息方式读取还是以字节方式读取。如果管道未处于消息模式,则管道客户端尝试将读取模式设置为 message ( PIPE_READMODE_MESSAGE) 不会有任何效果,因为它不会更改管道模式。

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

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

于 2013-06-10T12:07:24.407 回答