我有两个程序在同一台计算机上运行,我需要它们进行通话。一个是使用旧版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 。
我认为我在客户端匹配这个。如果有人可以提出建议我很感激。感谢。
答案 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.