0

我正在尝试使用 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_ALWAYS 时才会发生这种情况。我SetLastError(0)之前立即调用CreateFile()以确保GetLastError()结果是指该CreateFile()函数。

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

4

1 回答 1

2

文档表明您只能CreateFile在单个客户端中使用一次,之后您必须复制返回的句柄:

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

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

于 2013-02-14T20:45:43.897 回答