我有一个创建的 Windows 命名管道CreateFile(服务器端是使用创建的CreateNamedPipe)。我使用 IO 完成端口在两端异步读取/写入数据。
我需要在打开这些句柄后将它们发送给其他进程。我试图调用CloseHandle从返回的句柄CreateIoCompletionPort,然后在另一个进程中CreateIoCompletionPort再次调用。但是它总是失败并GetLastError返回 87 (ERROR_INVALID_PARAMETER )。
我也可以在一个过程中重现这一点,见下文。请注意,在我发送对象之前没有未完成的读/写操作。
std::wstring pipe_name = L"\\\\.\\pipe\\test.12345";
HANDLE server = CreateNamedPipeW(
pipe_name.c_str(),
PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED,
PIPE_TYPE_BYTE | PIPE_READMODE_BYTE,
1,
4096,
4096,
10000,
NULL);
SECURITY_ATTRIBUTES security_attributes = {
sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};
HANDLE client = CreateFileW(
pipe_name.c_str(), GENERIC_READ | GENERIC_WRITE,
0,
&security_attributes,
OPEN_EXISTING,
SECURITY_SQOS_PRESENT | SECURITY_ANONYMOUS | FILE_FLAG_OVERLAPPED,
NULL);
ULONG_PTR key = 1;
HANDLE comp_port = CreateIoCompletionPort(client, NULL, key, 1);
BOOL b1 = CloseHandle(comp_port);
comp_port = CreateIoCompletionPort(client, NULL, key, 1);
if (comp_port == NULL) {
int last_err = GetLastError();
}