从 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。
我想我在我的客户端上匹配了这一点。 如果有人能提出建议,我将不胜感激。 谢谢。
要打开带有 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);
源:命名管道错误 - 系统。未经授权访问异常:对路径的访问被拒绝。