我正在尝试使用CreateFile()打开命名管道:
g_hPipe = CreateFile(szPipeName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
其中szPipeName看起来像\\\\.\\pipe\\service_name
,我收到了INVALID_HANDLE_VALUE。
According to the MSDN,OPEN_EXISTING标志仅在文件不存在时才返回错误,但GetLastError()
显示ERROR_ALREADY_EXISTS(183)。我知道该文件存在,这就是我使用OPEN_EXISTING的原因...... MSDN建议只有在设置了OPEN_ALWAYS或CREATE_ALWAYS时才会出现这种情况。我会在SetLastError(0)
之前立即致电CreateFile()
,以确保GetLastError()
结果引用CreateFile()
功能。
我搜索了很多,但没有找到任何建议我收到此错误的原因。任何帮助表示赞赏。
答案 0 :(得分:2)
docs表示您只能在一个客户端中CreateFile
一次,之后您必须复制返回的句柄:
如果CreateFile打开命名管道的客户端,则该函数使用 处于侦听状态的任何命名管道实例。该 打开过程可以根据需要多次复制句柄, 但在打开之后,无法打开命名管道实例 另一个客户。
管道是点对点运输。如果您希望其他应用程序连接到您的服务器,它们将需要自己的管道实例,这意味着服务器上的另一个CreateNamedPipe调用。