Windows API - 设置为OPEN_EXISTING的CreateFile()返回错误代码ERROR_ALREADY_EXISTS(183)

时间:2013-02-14 20:35:36

标签: c++ winapi named-pipes createfile

我正在尝试使用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()功能。

我搜索了很多,但没有找到任何建议我收到此错误的原因。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

docs表示您只能在一个客户端中CreateFile一次,之后您必须复制返回的句柄:

  

如果CreateFile打开命名管道的客户端,则该函数使用   处于侦听状态的任何命名管道实例。该   打开过程可以根据需要多次复制句柄,   但在打开之后,无法打开命名管道实例   另一个客户。

管道是点对点运输。如果您希望其他应用程序连接到您的服务器,它们将需要自己的管道实例,这意味着服务器上的另一个CreateNamedPipe调用。