Тема: AHK: асинхронный именованный канал (pipe)
Здравствуйте, а у кого-нибудь получалось настроить асинхронную работу именованных каналов в ahk?
У меня получается только синхронная.
Насколько я понимаю, для асинхронной работы надо:
1. При создании именованного канала (CreateNamedPipe) использовать флаг FILE_FLAG_OVERLAPPED.
И вот тут уже начинается немного мути:
Судя по
If overlapped mode is not enabled, functions performing read, write, and connect operations on the pipe handle do not return until the operation is finished.
использования этого флага должно бы быть достаточно, но практика показывает, что, например, операция соединения сразу же не возвращается, а продолжает висеть до первого успешного соединения (т.е. когда клиент обратится к этому именованному каналу).
Поэтому, требуется использовать и флаг PIPE_NOWAIT, невзирая на
Note that nonblocking mode is supported for compatibility with Microsoft LAN Manager version 2.0 and should not be used to achieve asynchronous I/O with named pipes.
2. При соединении именованного канала (ConnectNamedPipe) требуется указать на валидную OVERLAPPED структуру.
И из-за того, что используется PIPE_NOWAIT - команда вернёт 0 с ошибкой
[#536] Идет ожидание открытия процессом другой стороны канала.
[#536] Waiting for a process to open the other end of the pipe.
т.к. клиент ещё не обратился к каналу.
3. После этого следует как-то отловить момент обращения клиента к каналу
4. При обращении клиента к каналу - сервер должен записать в канал данные (WriteFile/WriteFileEx)
Отсюда возникают сложности и вопросы.
Насколько я понимаю, следуя логике msdn - отслеживать момент подключения клиента каналу надо через состояние события, созданного через CreateEvent. Указатель на это событие должен быть использован при создании OVERLAPPED структуры.
Это вроде не сложно сделать (вроде), но вот как потом проверять состояние этого события?
Msdn говорит, что макросом HasOverlappedIoCompleted указывая ему на OVERLAPPED структуру, но msdn в то же время говорит, что проверять его стоит только если последняя ошибка равняется 997 (ERROR_IO_PENDING).
Это что же, надо вызывать ConnectNamedPipe заново? Пробовал, всегда одна и та же ошибка №536.
Как правильно-то делать?

