Can';是否打开名为Pipe的窗口进行写入?
我不明白为什么我甚至不能打开在另一个进程中创建的用于编写的命名管道 我得到了错误 231(所有管道实例都忙) 作者(客户): 然后使用Can';是否打开名为Pipe的窗口进行写入?,c,windows,winapi,named-pipes,C,Windows,Winapi,Named Pipes,我不明白为什么我甚至不能打开在另一个进程中创建的用于编写的命名管道 我得到了错误 231(所有管道实例都忙) 作者(客户): 然后使用PeekNamedPipe查看是否有数据要用ReadFile读取或发送超时。第4个参数-nMaxInstances-这是可以为此管道创建的最大实例数 所以这不是单个调用中创建的实例数,而是可以创建的最大实例数。对CreateNamedPipe的单个调用始终创建一(1)个管道实例。如果您想拥有4个实例,则需要调用CreateNamedPipe4次。另外,最初管道是在
PeekNamedPipe
查看是否有数据要用ReadFile
读取或发送超时。第4个参数-nMaxInstances
-这是可以为此管道创建的最大实例数
所以这不是单个调用中创建的实例数,而是可以创建的最大实例数。对CreateNamedPipe
的单个调用始终创建一(1)个管道实例。如果您想拥有4个实例,则需要调用CreateNamedPipe
4次。另外,最初管道是在侦听状态下创建的,所以客户端可以通过调用CreateFile
连接到它。但是,在连接断开(因为客户端关闭自身句柄)并且您希望接受同一管道实例的新客户端连接之后-您需要调用DisconnectNamedPipe
,然后调用ConnectNamedPipe
-只有在新客户端可以再次连接到同一管道实例之后
但无论如何,即使只创建一个管道实例,也可以通过单个调用CreateNamedPipeA
——第一个客户端可以连接到它。错误231-我猜真正的错误源是状态\u管道\u不可用
(无法找到命名管道的实例)
在侦听状态下找到)-您可以在
CreateFile
失败后调用RtlGetLastNtStatus()
检查此问题,而不是GetLastError()
说管道名称有效,访问没有问题,但有人已经连接(可能已经断开连接)管道-从不首先调用CreateFile
返回此错误,但您是否在服务器中调用ConnectNamedPipe
?如果没有服务器代码,则很难诊断4个实例中的问题,因此一个实例应该是免费的,不是吗?-但是您仍然需要调用CreateNamedPipe
4次来创建4个实例(1次调用仅创建一个实例)。连接断开后,需要调用DisconnectNamedPipe
+ConnectNamedPipe
再次侦听具体实例感谢对实例的说明。服务器端缺少ConnectNamedPipe
。现在我遇到了其他错误,但为了不完全改变这个问题,我开始了一个新的错误,并提供了完整的源代码:感谢您清除了API,连接顺序对我来说并不清楚。没错,它是0xC00000AC(状态为管道不可用)。但是,即使我在读取循环中执行了ConnectNamedPipe
,然后DisconnectNamedPipe
,我在大多数情况下都会获得相同的状态“所有实例都已占用”。我将编辑该问题,以获得完整的示例来说明我在做什么(错误)。我用完整的源代码开始了一个新问题,包括上述提示:
#include "Windows.h"
#include <stdio.h>
#include <errno.h>
int main()
{
HANDLE hpipe;
DWORD written;
char msg[] = "play asdf.wav";
hpipe = CreateFileA("\\\\.\\pipe\\isp-control",
GENERIC_WRITE | GENERIC_READ,
0, NULL, OPEN_EXISTING, 0, NULL);
if (hpipe != INVALID_HANDLE_VALUE)
{
WriteFile(hpipe, msg, strlen(msg) + 1, &written, NULL);
printf("wrote %d bytes of %d: '%s'\n", written, strlen(msg) + 1, msg);
CloseHandle(hpipe);
}
else
{
printf("error %d opening pipe (handle %d)\n", GetLastError(), (int) hpipe);
return 1;
}
return 0;
}
hpipe_ = CreateNamedPipeA("\\\\.\\pipe\\isp-control",
PIPE_ACCESS_DUPLEX,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT,
4, // number of instances
1024 * 16, // output buffer size
65535, // input size
2000, // default timeout ms
NULL);