<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: асинхронный именованный канал (pipe)]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=12103</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=12103&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: асинхронный именованный канал (pipe)».]]></description>
		<lastBuildDate>Tue, 01 Nov 2016 17:57:49 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108746#p108746</link>
			<description><![CDATA[<p>А, не берите в голову, оказывается то, чего я хочу (запускать именованные каналы как-будто это файлы) - это немного хак.</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Tue, 01 Nov 2016 17:57:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108746#p108746</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108744#p108744</link>
			<description><![CDATA[<p>А какого эффекта вы хотите добиться?</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 01 Nov 2016 13:16:50 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108744#p108744</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108742#p108742</link>
			<description><![CDATA[<p>Извините за лирическое отступление (off topic).<br />Где-то на подсознательном уровне я знал, что это разные проверки, но в них легко запутаться и я такое постоянно забываю, так что для меня это каждый раз открытие, ведь операция присваивания значения в переменную - это же присваивание выражения (expression, правой части), а пустое выражение же, вроде как, то же самое, что и false или 0 (по крайней мере у меня в голове оно так ассоциируется).</p><br /><p>Чего-то дальше пока дела медленно двигаются: теперь момент подключения клиента известен, всё работает в асинхронном режиме, но записать содержимое в канал не получалось: по логике msdn я должен это делать вызовом, например, <a href="https://msdn.microsoft.com/library/aa365747(v=vs.85).aspx">WriteFile</a> и вызов должен бы возвращаться с ошибкой у меня бы должна происходить ошибкой ERROR_IO_PENDING (997, Overlapped I/O operation is in progress), что должно сигнализировать о протекающем процессе передачи.<br />Но вместо этой ошибки - команда возвращалась с ошибкой ERROR_NO_DATA (232 The pipe is being closed / Идет закрытие канала).<br />Оказалось, что надо на стороне клиента просто какой-то Sleep хотя бы использовать или подождать иным образом, т.к. WriteFile на сервере начинает отрабатывать уже после того, как клиент завершил <a href="https://msdn.microsoft.com/library/aa363858(v=vs.85%29.aspx">CreateFile</a>.</p><p>Потом я немного запнулся: клиент после CreateFile должен вызывать <a href="https://msdn.microsoft.com/library/aa365467(v=vs.85).aspx">ReadFile</a> (или подобную команду).<br />Заметил, что у вас вызов CreateFile предполагается со флагом FILE_FLAG_OVERLAPPED, но из-за ошибки в коде этого не происходит. В вашем коде для клиентской стороны в вызове CreateFile - лишняя строка:<br /></p><div class="codebox"><pre><code>            , &quot;uint&quot;, 0</code></pre></div><p>Ошибку исправил.<br />Но вот я не уверен, что следующий шаг я делаю правильно: я на клиентской стороне петлёй циклично вызываю <a href="https://msdn.microsoft.com/library/aa365467(v=vs.85).aspx">ReadFile</a> до тех пор, пока GetLastError не начнёт что-то выдавать, а на серверной стороне или закрываю хэндл (CloseHandle), либо после некоторого Sleep (чтобы клиент успел всё прочитать, но это ненадёжный вариант: я тут Sleep на глазок могу только выставить) инициирую разъединение канала (DisconnectNamedPipe).<br />Выполнение одного из этих двух действий на стороне сервера оборачивается тем, что на стороне клиента ReadFile генерирует ошибку ERROR_PIPE_NOT_CONNECTED	(233	No process is on the other end of the pipe.) в случае, если сервер выполнил DisconnectNamedPipe, или ошибку ERROR_BROKEN_PIPE (109	The pipe has been ended.), в случае, если сервер выполнил CloseHandle.<br />Пока я остановился на CloseHandle, т.к. он не требует Sleep, но мне кажется, что что-то я делаю не правильно, хоть в итоге всё и работает кое-как.</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Tue, 01 Nov 2016 12:03:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108742#p108742</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108721#p108721</link>
			<description><![CDATA[<p>Нет, не одно и то же. Если сама команда DllCall не сможет нормально отработать, то Ret будет пустой, а False — это число 0. В этом случае моя проверка будет пройдена, а ваша нет.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Mon, 31 Oct 2016 12:39:11 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108721#p108721</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108720#p108720</link>
			<description><![CDATA[<p>Я с трудом, но разобрался, что за дичь у меня происходит.<br />У вас в коде есть такой кусок:<br /></p><div class="codebox"><pre><code>    Ret := DllCall(&quot;GetOverlappedResult&quot;, &quot;ptr&quot;, hPipe, &quot;ptr&quot;, &amp;OVERLAPPED
                                        , &quot;ptr&quot;, 0, &quot;int&quot;, False)
    If (Ret != False) {
        Break
    }</code></pre></div><p>И чего-то я не понимаю какого чёрта он ведёт себя иначе, чем такой кусок, который использовался у меня:<br /></p><div class="codebox"><pre><code>    Ret := DllCall(&quot;GetOverlappedResult&quot;, &quot;ptr&quot;, hPipe, &quot;ptr&quot;, &amp;OVERLAPPED
                                        , &quot;ptr&quot;, 0, &quot;int&quot;, False)
    If (Ret) {
        Break
    }</code></pre></div><p>Другими словами: разве if (var) не то же самое, что и If (var != false)?</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Mon, 31 Oct 2016 12:19:19 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108720#p108720</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108673#p108673</link>
			<description><![CDATA[<p>Хотя нет, вы правы, проверять возвращаемое значение тут бесполезно. Им стоило написать, что в этом случае оно не используется, а не то, что оно равно нулю. А то только с толку сбивают.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Sat, 29 Oct 2016 03:27:40 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108673#p108673</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108649#p108649</link>
			<description><![CDATA[<div class="quotebox"><cite>ШКОЛЯРРРРРРЪ пишет:</cite><blockquote><p>1. Не знаю зачем вы используете FuncSuffix := A_IsUnicode? &quot;W&quot;:&quot;A&quot;, ведь в справке по DllCall() сказано:</p></blockquote></div><p>Это я то ли пропустил, то ли забыл. <img src="//forum.script-coding.com/img/smilies/smile.png" width="15" height="15" /></p><div class="quotebox"><cite>ШКОЛЯРРРРРРЪ пишет:</cite><blockquote><p>2. У меня реальный код тоже изобилует всяческими проверками, но некоторые из них не нужны. Например, при использовании флага FILE_FLAG_OVERLAPPED на этапе создания канала - нет смысла проверять возвращаемое ConnectNamedPipe значение, оно всегда будет равно нулю.</p></blockquote></div><p>Будет равно нулю, но это иногда означает ошибку в работе функции, а иногда нет. Для этого я и проверяю ещё A_LastError. Всё в соответствии с документацией.<br /></p><div class="quotebox"><cite>ConnectNamedPipe Function пишет:</cite><blockquote><p>If the operation is asynchronous, ConnectNamedPipe returns immediately. If the operation is still pending, the return value is zero and GetLastError returns ERROR_IO_PENDING. (You can use the GetOverlappedResult function to retrieve the results after the operation has finished.) <strong>If the function fails, the return value is zero and GetLastError returns a value other than ERROR_IO_PENDING or ERROR_PIPE_CONNECTED.</strong></p></blockquote></div>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Fri, 28 Oct 2016 05:27:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108649#p108649</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108641#p108641</link>
			<description><![CDATA[<p>Во-первых, спасибо за попытку помочь, тут дело очень сложное.</p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Вообще-то значение должно быть 0x40000000. У вас тут ещё добавлено FILE_FLAG_WRITE_THROUGH. Оно точно не мешает?</p></blockquote></div><p>Верно подмечено, я уж и забыл, что и FILE_FLAG_WRITE_THROUGH добавил. Вероятно, стоило тестировать и без него (над проблемой я уже неделю бьюсь).</p><div class="quotebox"><cite>YMP пишет:</cite><blockquote><p>Вот набросал пример подключения. Сначала запустите сервер, потом клиент.</p></blockquote></div><p>Я пока пытаюсь его разобрать и это лишь часть комментариев/вопросов по вашему коду:<br />1. Не знаю зачем вы используете FuncSuffix := A_IsUnicode? &quot;W&quot;:&quot;A&quot;, ведь в справке по DllCall() сказано:<br /></p><div class="quotebox"><blockquote><p>If no function can be found by the given name, an A (ANSI) or W (Unicode) suffix is automatically appended based on which version of AutoHotkey is running the script. For example, &quot;MessageBox&quot; is the same as &quot;MessageBoxA&quot; in ANSI versions and &quot;MessageBoxW&quot; in Unicode versions.</p></blockquote></div><p>2. У меня реальный код тоже изобилует всяческими проверками, но некоторые из них не нужны. Например, при использовании флага FILE_FLAG_OVERLAPPED на этапе создания канала - нет смысла проверять возвращаемое ConnectNamedPipe значение, оно всегда будет равно нулю. Я не с целью придраться это пишу, а просто я уже документацию раз 20, наверно, прочитал и потому и делюсь мелкими нюансами. Я-то сначала вообще всё через try dllcall(…) throw exception(…) сделал, а потом понял, что я это сииильно погорячился так делать для каждой команды и что не всегда ошибка означает что-то плохое.<br />3. Благодаря вам заметил у себя в коде ошибку в вызове ConnectNamedPipe:<br />DllCall(&quot;ConnectNamedPipe&quot;, &quot;ptr&quot;, hPipe, &quot;ptr&quot;, <strong>&amp;</strong>OVERLAPPED)<br />из-за того, что я отправлял саму структуру, а не её адрес (я запутался и зря полагался на &quot;Ptr&quot;) - я как раз и наблюдал то поведение, которое я описал в первом посте и которое противоречит документации msdn:<br /></p><div class="quotebox"><cite>ШКОЛЯРРРРРРЪ пишет:</cite><blockquote><p>И вот тут уже начинается немного мути:<br />Судя по<br /></p><div class="quotebox"><blockquote><p>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.</p></blockquote></div><p>использования этого флага должно бы быть достаточно, но практика показывает, что, например, операция соединения сразу же не возвращается, а продолжает висеть до первого успешного соединения (т.е. когда клиент обратится к этому именованному каналу).<br />Поэтому, требуется использовать и флаг PIPE_NOWAIT, невзирая на<br /></p><div class="quotebox"><blockquote><p>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.</p></blockquote></div></blockquote></div><p>4. Эту же ошибку я и в вызову GetOverlappedResult совершил, поэтому-то она всегда и выдавала мне false, а ещё я заметил, что вместо GetOverlappedResult я ошибочно вызывал HasOverlappedIoCompleted.<br />5. Сейчас я сам попытаюсь на основе вашего примера сделать передачу данных, но пока у меня какие-то странные ошибки: конкретно ваш скрипт - работает, а аналогично выстроенный но мой (который базируется на внешней библиотеке с функциями-обёртками вокруг DllCall вызовов) - отказывается. Причём всё идентично и я пока не понимаю в чём дело, плюс началась чертовщина, вроде того, что GetOverlappedResult возвращает пустоту (т.е. false), но при этом и проверка != false срабатывает. :-/ Смотрю длину строки - 0. Но не false. У меня уже шарики за ролики сейчас заезжают, я попозже ещё попытаюсь.</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Thu, 27 Oct 2016 18:58:35 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108641#p108641</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108637#p108637</link>
			<description><![CDATA[<p>Вот набросал пример подключения. Сначала запустите сервер, потом клиент.<br /></p><div class="codebox"><pre><code>
; Сервер
PIPE_ACCESS_DUPLEX := 3, FILE_FLAG_OVERLAPPED := 0x40000000, PIPE_TYPE_BYTE := 0
INVALID_HANDLE_VALUE := -1, ERROR_IO_PENDING := 997, ERROR_IO_INCOMPLETE := 996
PipeName := &quot;HelloPipe&quot;, FuncSuffix := A_IsUnicode? &quot;W&quot;:&quot;A&quot;

hPipe := DllCall(&quot;CreateNamedPipe&quot; . FuncSuffix
        , &quot;str&quot;, &quot;\\.\pipe\&quot; . PipeName
        , &quot;uint&quot;, PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED
        , &quot;uint&quot;, PIPE_TYPE_BYTE
        , &quot;uint&quot;, 1
        , &quot;uint&quot;, 0
        , &quot;uint&quot;, 0
        , &quot;uint&quot;, 0
        , &quot;ptr&quot;, 0
        , &quot;ptr&quot;)
If (hPipe = INVALID_HANDLE_VALUE) {
    MsgBox, Ошибка CreateNamedPipe: %A_LastError%
    Return
}
VarSetCapacity(OVERLAPPED, 8 + 3 * A_PtrSize, 0)
hEvent := DllCall(&quot;CreateEvent&quot;, &quot;ptr&quot;, 0, &quot;int&quot;, True, &quot;int&quot;, False, &quot;ptr&quot;, 0, &quot;ptr&quot;)
If (hEvent = 0) {   
    MsgBox, Ошибка CreateEvent: %A_LastError%
    Return
}
NumPut(hEvent, OVERLAPPED, 8 + 2 * A_PtrSize, &quot;ptr&quot;)
Ret := DllCall(&quot;ConnectNamedPipe&quot;, &quot;ptr&quot;, hPipe, &quot;ptr&quot;, &amp;OVERLAPPED)
If (Ret = 0 &amp;&amp; A_LastError != ERROR_IO_PENDING) {
    MsgBox, Ошибка ConnectNamedPipe: %A_LastError%
    Return
}

Loop
{
    Ret := DllCall(&quot;GetOverlappedResult&quot;, &quot;ptr&quot;, hPipe, &quot;ptr&quot;, &amp;OVERLAPPED
                                        , &quot;ptr&quot;, 0, &quot;int&quot;, False)
    If (Ret != False) {
        Break
    }
    If (A_LastError != ERROR_IO_INCOMPLETE) {
        MsgBox, Ошибка GetOverlappedResult: %A_LastError%
        Return
    }
}

MsgBox, Сервер`nКлиент подключился.
</code></pre></div><div class="codebox"><pre><code>
; Клиент
GENERIC_READ := 0x80000000, GENERIC_WRITE := 0x40000000
FILE_SHARE_READ := 1, FILE_SHARE_WRITE := 2
OPEN_EXISTING := 3, FILE_FLAG_OVERLAPPED := 0x40000000
INVALID_HANDLE_VALUE := -1
PipeName := &quot;HelloPipe&quot;, FuncSuffix := A_IsUnicode? &quot;W&quot;:&quot;A&quot;
hPipe := DllCall(&quot;CreateFile&quot; . FuncSuffix
            , &quot;str&quot;, &quot;\\.\pipe\&quot; . PipeName
            , &quot;uint&quot;, GENERIC_READ | GENERIC_WRITE
            , &quot;uint&quot;, FILE_SHARE_READ | FILE_SHARE_WRITE
            , &quot;ptr&quot;, 0
            , &quot;uint&quot;, OPEN_EXISTING
            , &quot;uint&quot;, 0
            , &quot;uint&quot;, FILE_FLAG_OVERLAPPED
            , &quot;ptr&quot;, 0
            , &quot;ptr&quot;)
If (hPipe = INVALID_HANDLE_VALUE) {
    MsgBox, Ошибка CreateFile: %A_LastError%
    Return
}
MsgBox, Клиент`nСервер подключен.
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 27 Oct 2016 15:03:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108637#p108637</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108632#p108632</link>
			<description><![CDATA[<div class="quotebox"><cite>ШКОЛЯРРРРРРЪ пишет:</cite><blockquote><p>FILE_FLAG_OVERLAPPED := 0xc0000000</p></blockquote></div><p>Вообще-то значение должно быть 0x40000000. У вас тут ещё добавлено FILE_FLAG_WRITE_THROUGH. Оно точно не мешает?</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 27 Oct 2016 13:41:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108632#p108632</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108628#p108628</link>
			<description><![CDATA[<p>Вроде задачу описал…<br />Именованные каналы используются для передачи данных двух типов: сообщений и байтов. Я хочу байты передавать.<br />Передача возможна как по сети, так и локально, для организации межпроцессной коммуникации.<br />Рабочего кода нет, по этой причине и пишу сюда.<br />Есть лишь отдельные куски на вызов команд.</p><div class="codebox"><pre><code>; server
OnExit, Exit
PIPE_ACCESS_DUPLEX := 3, FILE_FLAG_OVERLAPPED := 0x40000000, FILE_FLAG_WRITE_THROUGH := 0x80000000, PIPE_NOWAIT := 1

pipe_name := &quot;test&quot;, open_mode := PIPE_ACCESS_DUPLEX | FILE_FLAG_OVERLAPPED | FILE_FLAG_WRITE_THROUGH, pipe_mode := PIPE_NOWAIT, content := (A_IsUnicode ? Chr(0xFEFF) : Chr(239) Chr(187) Chr(191)) &quot;MsgBox, Hello world!&quot;	; With BOM prepended.

testHWND := DllCall(&quot;CreateNamedPipe&quot;, &quot;Str&quot;,&quot;\\.\pipe\&quot; pipe_name , &quot;UInt&quot;,open_mode, &quot;UInt&quot;,pipe_mode, &quot;UInt&quot;,255, &quot;UInt&quot;,0, &quot;UInt&quot;,0, &quot;UInt&quot;,0, &quot;Ptr&quot;,0, &quot;Ptr&quot;)	; использоваться не будет, но особенность работы каналов в ahk требует этого.
pipeHWND := DllCall(&quot;CreateNamedPipe&quot;, &quot;Str&quot;,&quot;\\.\pipe\&quot; pipe_name , &quot;UInt&quot;,open_mode, &quot;UInt&quot;,pipe_mode, &quot;UInt&quot;,255, &quot;UInt&quot;,0, &quot;UInt&quot;,0, &quot;UInt&quot;,0, &quot;Ptr&quot;,0, &quot;Ptr&quot;)

overlapped := &quot;&quot;
VarSetCapacity(overlapped, 8 + 3 * A_PtrSize, 0)
eventHwnd := DllCall(&quot;CreateEvent&quot;, &quot;Ptr&quot;,0, &quot;Int&quot;,true, &quot;Int&quot;,0, &quot;Ptr&quot;,0, &quot;Ptr&quot;)
NumPut(eventHwnd, overlapped, 8 + 2 * A_PtrSize, &quot;Ptr&quot;)

DllCall(&quot;ConnectNamedPipe&quot;, &quot;Ptr&quot;,pipeHWND, &quot;Ptr&quot;,overlapped, &quot;Int&quot;)

If (A_LastError == 536)
	MsgBox, Connecting to a pipe resulted into error 536`nWaiting for a process to open the other end of the pipe.
ExitApp

CallThisWhenClientConnects:
	DllCall(&quot;WriteFile&quot;, &quot;Ptr&quot;,pipeHWND, &quot;Str&quot;,content, &quot;UInt&quot;,(StrLen(content) + 1) * (A_IsUnicode ? 2 : 1), &quot;UIntP&quot;,0, &quot;Ptr&quot;,overlapped, &quot;Int&quot;)
	DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;,pipeHWND, &quot;Int&quot;)	; это неправильно, но без этого, почему-то, не работает.
Return

Exit:
	DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;,testHWND, &quot;Int&quot;)
	DllCall(&quot;CloseHandle&quot;, &quot;Ptr&quot;,pipeHWND, &quot;Int&quot;)
	ExitApp</code></pre></div><div class="codebox"><pre><code>; client
pipe_name := &quot;test&quot;
Run, %A_AhkPath% &quot;\\.\pipe\%pipe_name%&quot;
</code></pre></div><p>После WriteFile почему-то не отдаётся сигнал о завершении передачи на данных по каналу клиенту до тех пор, пока я не вызову CloseHandle на сервере - это ещё одна проблема, но <a href="https://social.msdn.microsoft.com/Forums/vstudio/en-US/f6d41f14-4c66-435e-94e6-7639ea8f73aa/writefile-does-not-send-data-until-closehandle-is-called?forum=vclanguage">оказывается</a>, что она известна и по ссылке приводится решение, которое я не уверен, что подойдёт для ahk: как вызов метода read должен спасти в ситуации, где, насколько я понимаю, требуется решение на серверной стороне?</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Thu, 27 Oct 2016 12:44:28 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108628#p108628</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108623#p108623</link>
			<description><![CDATA[<p>Я этой темой не интересовался, не смогу подсказать, но в любом случае подобный пост стоило бы начать с описания задачи, которую пытаетесь решить. Ну и привести какой-нибудь рабочий код для примера.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Wed, 26 Oct 2016 19:20:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108623#p108623</guid>
		</item>
		<item>
			<title><![CDATA[AHK: асинхронный именованный канал (pipe)]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=108622#p108622</link>
			<description><![CDATA[<p>Здравствуйте, а у кого-нибудь получалось настроить асинхронную работу именованных каналов в ahk?<br />У меня получается только синхронная.<br />Насколько я понимаю, для асинхронной работы надо:<br />1. При создании именованного канала (<a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365150(v=vs.85).aspx">CreateNamedPipe</a>) использовать флаг FILE_FLAG_OVERLAPPED.<br />И вот тут уже начинается немного мути:<br />Судя по<br /></p><div class="quotebox"><blockquote><p>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.</p></blockquote></div><p>использования этого флага <a href="https://blogs.msdn.microsoft.com/oldnewthing/20110114-00/?p=11753">должно бы быть достаточно</a>, но практика показывает, что, например, операция соединения сразу же не возвращается, а продолжает висеть до первого успешного соединения (т.е. когда клиент обратится к этому именованному каналу).<br />Поэтому, требуется использовать и флаг PIPE_NOWAIT, невзирая на<br /></p><div class="quotebox"><blockquote><p>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.</p></blockquote></div><p>2. При соединении именованного канала (<a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa365146(v=vs.85).aspx">ConnectNamedPipe</a>) требуется указать на валидную <a href="https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms684342(v=vs.85).aspx">OVERLAPPED структуру</a>.<br />И из-за того, что используется PIPE_NOWAIT - команда вернёт 0 с ошибкой<br /></p><div class="quotebox"><blockquote><p>[#536] Идет ожидание открытия процессом другой стороны канала.<br />[#536] Waiting for a process to open the other end of the pipe.</p></blockquote></div><p>т.к. клиент ещё не обратился к каналу.</p><p>3. После этого следует как-то отловить момент обращения клиента к каналу</p><p>4. При обращении клиента к каналу - сервер должен записать в канал данные (WriteFile/WriteFileEx)	</p><p>Отсюда возникают сложности и вопросы.<br />Насколько я понимаю, следуя логике msdn - отслеживать момент подключения клиента каналу надо через состояние события, созданного через CreateEvent. Указатель на это событие должен быть использован при создании OVERLAPPED структуры.<br />Это вроде не сложно сделать (вроде), но вот как потом проверять состояние этого события?<br />Msdn говорит, что макросом HasOverlappedIoCompleted указывая ему на OVERLAPPED структуру, но msdn в то же время говорит, что проверять его стоит только если последняя ошибка равняется 997 (ERROR_IO_PENDING).<br />Это что же, надо вызывать ConnectNamedPipe заново? Пробовал, всегда одна и та же ошибка №536.</p><p>Как правильно-то делать?</p>]]></description>
			<author><![CDATA[null@example.com (ШКОЛЯРРРРРРЪ)]]></author>
			<pubDate>Wed, 26 Oct 2016 18:27:42 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=108622#p108622</guid>
		</item>
	</channel>
</rss>
