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

Mic*_*uer 1 .net c# c++ winapi named-pipes

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

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

这是 .NET 服务器代码:

    private volatile NamedPipeServerStream pipeServer;
    pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
    pipeServer.WaitForConnection();
Run Code Online (Sandbox Code Playgroud)

以下是较旧的现有 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
);
Run Code Online (Sandbox Code Playgroud)

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

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

我想我正在客户端匹配这个。如果有人可以提出建议,我将不胜感激。谢谢。

Jer*_*fin 5

要使用 来打开命名管道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
);
Run Code Online (Sandbox Code Playgroud)