2013-02-14 6 views
0

Я пытаюсь открыть именованный канал с помощью CreateFile():Windows API - CreateFile() с набором OPEN_EXISTING возвращает код ошибки ERROR_ALREADY_EXISTS (183)

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 возвращает ошибку, если файл не существует, но показывает ERROR_ALREADY_EXISTS (183). Я знаю, что файл существует, поэтому я использую OPEN_EXISTING ... MSDN предполагает, что это происходит только тогда, когда установлены OPEN_ALWAYS или CREATE_ALWAYS. Я звоню SetLastError(0) непосредственно перед CreateFile(), чтобы убедиться, что результат GetLastError() относится к функции CreateFile().

Я искал совсем немного и не нашел ничего, чтобы предположить, почему я получаю эту ошибку. Любая помощь приветствуется.

+0

Это дуплекс (чтение/запись) трубы? – arx

+0

Вот пример использования именованных каналов, хотя у него нет ответа на ваш конкретный вопрос: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365592(v=vs.85). aspx – HerrJoebob

+0

Да, сервер создает дуплексный канал. – jfinnis

ответ

2

docs указать, что вы можете только CreateFile один раз в одном клиенте, после того, что вы должны дублировать возвращенный дескриптор:

Если CreateFile открывает конец клиента именованной трубы, функция использует любой экземпляр именованного канала, который находится в состоянии прослушивания. Процесс открытия может дублировать дескриптор столько раз, сколько требуется, , но после его открытия экземпляр именованного канала не может быть открыт другим клиентом.

Трубы представляют собой двухточечный транспорт. Если вы хотите, чтобы другие приложения подключались к вашему серверу, им понадобится собственный экземпляр канала, что означает, что на сервере будет вызван другой вызов CreateNamedPipe.

+0

В этом случае CreateFile() должен выбросить ERROR_PIPE_BUSY. – HerrJoebob

+0

Ручка создается только один раз в клиенте и используется повторно. Кажется, сервер вызывается 'CreateNamedPipe()' каждый раз, когда поток получает данные (он делает это с первого взгляда, по крайней мере, довольно обширный внутренний API). – jfinnis

+0

Да, вы правы. Интересно, являются ли используемые варианты совместного использования причинами? то есть. третий параметр равен нулю, когда оба вызова CreateFile используют READ | WRITE доступ? –

 Смежные вопросы

  • Нет связанных вопросов^_^