【问题标题】:Having trouble connecting to named pipe from a C++ win32 program从 C++ win32 程序连接到命名管道时遇到问题
【发布时间】:2014-05-17 12:08:50
【问题描述】:

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

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

【问题讨论】:

  • \Device\NamedPipe\MyPipe 是内核看到的设备路径。根据 Jerry 的回答,Win32 子系统使用不同的语法。

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


【解决方案1】:

要使用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
);

【讨论】:

  • 是的,就是这样。我最初尝试过这个,但使用“管道”而不是“管道”作为我关注的 Web 示例 (avid-insight.co.uk/2012/03/…)。在那个例子中,两个应用程序都使用了 win32 框架,所以它似乎已经成功了。我的猜测是 .NET 抽象默认使用大写的“管道”。使用大写名称,它现在对我有用。我希望这可以帮助其他可能在未来为此苦苦挣扎的人。感谢您的帮助。
【解决方案2】:

设置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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-30
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多