Я пытаюсь открыть именованный канал с помощью 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()
функция.
Я искал довольно много и не нашел ничего, что могло бы подсказать, почему я получаю эту ошибку. Любая помощь приветствуется.
документы указать, что вы можете только CreateFile
один раз в одном клиенте, после этого вы должны продублировать возвращенный дескриптор:
Если CreateFile открывает клиентский конец именованного канала, функция использует
любой экземпляр именованного канала, который находится в состоянии прослушивания.
процесс открытия может дублировать ручку столько раз, сколько требуется,
но после открытия экземпляр именованного канала не может быть открыт
другой клиент.
Трубы представляют собой двухточечный транспорт. Если вы хотите, чтобы другие приложения подключались к вашему серверу, им потребуется собственный экземпляр канала, что означает еще один вызов CreateNamedPipe на сервере.
Других решений пока нет …