无法从C ++ win32程序连接到命名管道

时间:2014-04-05 00:57:36

标签: c# c++ .net winapi named-pipes

我有两个程序在同一台计算机上运行,​​我需要它们进行通话。一个是使用旧版windows32框架用C ++编写的现有程序。另一个是使用.NET框架的新编写的C#应用​​程序。我的新.NET应用程序将充当服务器,旧的现有应用程序将充当客户端。

我在客户端和服务器上都创建了命名管道。我只是无法让他们连接。我怀疑问题只是我没有正确匹配文件名(命名管道在后台使用文件)。

这是.NET服务器代码:

    private volatile NamedPipeServerStream pipeServer;
    pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
    pipeServer.WaitForConnection();

以下是现有的旧版win32客户端代码:

HANDLE pipe = CreateFile(
    "\\Device\\NamedPipe\\MyPipe",
    GENERIC_READ | GENERIC_WRITE, // only need read access
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
);

我先运行服务器代码然后它就在那里等待连接。我的句柄每次都等于INVALID_HANDLE_VALUE

我使用ProcessExplorer来查看是否可以找到管道的真实名称。根据ProcessExplorer,名称为 \ Device \ NamedPipe \ MyPipe

我认为我在客户端匹配这个。如果有人可以提出建议我很感激。感谢。

2 个答案:

答案 0 :(得分:4)

要使用CreateFile打开命名管道,您需要将文件名指定为\\.\pipe\name,因此在您的情况下,它应如下所示:

HANDLE pipe = CreateFile(
    "\\\\.\\Pipe\\MyPipe",
    GENERIC_READ | GENERIC_WRITE, // only need read access
    FILE_SHARE_READ | FILE_SHARE_WRITE,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
);

答案 1 :(得分:0)

设置PipeSecurity为我解决了这个问题。让它Everyone可访问看起来不太安全,但它确实有用。

PipeSecurity ps = new PipeSecurity();
PipeAccessRule psRule = new PipeAccessRule(@"Everyone", PipeAccessRights.ReadWrite, System.Security.AccessControl.AccessControlType.Allow);
ps.AddAccessRule(psRule);
 NamedPipeServerStream pipeServer = new NamedPipeServerStream("datapipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 1, 1, ps);

来源:Named Pipe Error - System.UnauthorizedAccessException: Access to the path is denied.