设置了OPEN_EXISTING的Windows API-CreateFile()返回error_ALREADY_EXI

Windows API - CreateFile() with OPEN_EXISTING set returns error code of ERROR_ALREADY_EXISTS (183)

本文关键字:返回 error ALREADY EXI Windows OPEN EXISTING 设置 API-CreateFile      更新时间:2023-10-16

我正试图使用CreateFile()打开一个命名管道:

g_hPipe = CreateFile(szPipeName, 
                    GENERIC_READ | GENERIC_WRITE, 
                    0, 
                    NULL, 
                    OPEN_EXISTING, 
                    FILE_FLAG_OVERLAPPED, 
                    NULL);

其中szPipeName看起来像\\.\pipe\service_name,并且返回INVALID_HANDLE_VALUE。

根据MSDN的说法,OPEN_EXISTING标志只在文件不存在的情况下返回错误,而GetLastError()显示error_ALREADY_EXISTS(183)。我知道该文件存在,这就是我使用OPEN_EXISTING的原因。。。MSDN建议只有在设置了OPEN_ALWAYS或CREATE_ALLWAYS时才会发生这种情况。我在CreateFile()之前立即调用SetLastError(0),以确保GetLastError()的结果引用了CreateFile()函数。

我已经搜索了很多,没有找到任何东西来说明我收到这个错误的原因。感谢您的帮助。

文档指示在单个客户端中只能CreateFile一次,之后必须复制返回的句柄:

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

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