Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C+连接到命名管道时遇到问题+;win32程序_C#_C++_.net_Winapi_Named Pipes - Fatal编程技术网

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

C# 从C+连接到命名管道时遇到问题+;win32程序,c#,c++,.net,winapi,named-pipes,C#,C++,.net,Winapi,Named Pipes,我有两个在同一台计算机上运行的程序,我需要它们对话。一个是用老的Windows 32框架在C++中编写的现有程序。另一个是使用.NET框架编写的新C#应用程序。我较新的.NET应用程序将充当服务器,而较旧的现有应用程序将充当客户端 我已经在客户端和服务器上创建了命名管道。我只是无法让他们联系上。我怀疑问题只是我没有正确匹配文件名(命名管道在后台使用文件) 以下是.NET服务器代码: private volatile NamedPipeServerStream pipeServer;

我有两个在同一台计算机上运行的程序,我需要它们对话。一个是用老的Windows 32框架在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
);
我首先运行服务器代码,它就在那里等待连接。每次我的句柄等于
无效的\u句柄\u值时

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

要使用
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
为我解决了这个问题。让
每个人都能访问它
看起来不那么安全,但它起了作用

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

来源:

设置
PipeSecurity
为我解决了这个问题。让
每个人都能访问它
看起来不那么安全,但它起了作用

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

来源:

内核看到的
\Device\NamedPipe\MyPipe
是设备路径。根据Jerry的回答,Win32子系统使用不同的语法。
\Device\NamedPipe\MyPipe
是内核看到的设备路径。根据Jerry的回答,Win32子系统使用了不同的语法。是的,就是这样。我最初尝试过这个方法,但是使用了“pipe”而不是“pipe”,正如下面的web示例()所示。在那个例子中,两个应用程序都使用了win32框架,所以它似乎已经成功了。我的猜测是.NET抽象默认使用大写“Pipe”。使用大写名称,现在对我有效。我希望这能帮助将来可能在这方面苦苦挣扎的其他人。谢谢你的帮助。是的,就是这样。我最初尝试过这个方法,但是使用了“pipe”而不是“pipe”,正如下面的web示例()所示。在那个例子中,两个应用程序都使用了win32框架,所以它似乎已经成功了。我的猜测是.NET抽象默认使用大写“Pipe”。使用大写名称,现在对我有效。我希望这能帮助将来可能在这方面苦苦挣扎的其他人。谢谢你的帮助。