从 C++ win32 程序连接到命名管道时出现问题

本文关键字:管道 问题 win32 C++ 程序 连接 | 更新日期: 2023-09-27 17:56:39

我有两个程序在同一台计算机上运行,我需要它们来说话。 一个是使用较旧的 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

我想我在我的客户端上匹配了这一点。 如果有人能提出建议,我将不胜感激。 谢谢。

从 C++ win32 程序连接到命名管道时出现问题

要打开带有 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
);

设置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);

源:命名管道错误 - 系统。未经授权访问异常:对路径的访问被拒绝。