<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820860</guid>
        <pubDate>Tue, 11 Feb 2020 06:54:33 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820860</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820641'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T19:09:09+03:00">07.02.20, 16:09</time></span><div class='quote '> в отладке юзай, что хочешь и как хочешь. В продакшн не переноси. </div></div>Согласен. Только в крайнем случае).<br>
<br>
<strong class='tag-b'>ЫукпШ</strong>, спасибо за помощь. Только я немного разобрал твой код, что-то объединил и адаптировал к привычному для меня стилю. Вместо класса cmdShell_b сделал несколько функций. В результате не сразу, но всё заработало. Но всё-таки сделаю класс - так удобнее и элегантнее: мне понравился твой подход. <br>
На этом тему пока закрою. Если опять возникнут вопросы при эксплуатации, задам снова. Всем спасибо.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820641</guid>
        <pubDate>Fri, 07 Feb 2020 16:09:09 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820641</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>vlad2</strong>, в отладке юзай, что хочешь и как хочешь. В продакшн не переноси. Будешь сильно недоволен, например, тем, что очень важные отладочные логи не записались. Или там лицензия на сервере лицензий залипла на сутки. Или ещё чего.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820637</guid>
        <pubDate>Fri, 07 Feb 2020 14:28:17 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820637</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820592'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T11:36:12+00:00">07.02.20, 11:36</time></span><div class='quote '>Цитата ЫукпШ @ Вчера, 23:56<br>
Terminate - не так уж редко нужно.<br>
Никогда не нужно. Ею должен пользоваться только пользователь только из таск-менеджера. </div></div><br>
Бывает, нужно: сам применяю, когда идёт очередь выполнения задач, и задержка цикла гораздо критичнее принудительного завершения процесса. Приходится прибивать.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820595</guid>
        <pubDate>Fri, 07 Feb 2020 11:51:42 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820595</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820594'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T11:47:28+00:00">07.02.20, 11:47</time></span><div class='quote '>Аппаратный сброс на микроконтроллер подаётся от генератора постоянно.<br>
Во временном промежутками между сбросами контроллер и выполняет<br>
всю работу. Такая вычислительная система не может зависнуть...</div></div> :lool: Это пять.<br>
Вэлкам ту Холиварс, <strong class='tag-b'>ЫукпШ</strong>. Создавай тему, тут заканчиваем, бо <strong class='tag-b'>B.V.</strong> счас взбесится. Перед созданием рекомендую ознакомиться с такими типами систем, как hosted и freestanding, пригодится.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820594</guid>
        <pubDate>Fri, 07 Feb 2020 11:47:28 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820594</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820592'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T11:36:12+00:00">07.02.20, 11:36</time></span><div class='quote '><strong class='tag-b'>ЫукпШ</strong>, ты комп тоже reset-ом ребутаешь? Ненуачё, а вдруг какая-то аппликуха откажется отвечать, какой-то драйвер не отпустит свою шелезяку...</div></div><br>
<strong class='tag-b'>Qraizer</strong>, ниочём.<br>
-----<br>
А вообще у меня есть такая функция - в софте у микроконтроллеров - аппаратный reset.<br>
Можно даже дать по сети. &quot;И чо ?&quot;. Никаких комплексов - если надо, значит сделаем.<br>
-----<br>
Есть даже такой характерный приём программирования системы.<br>
Хорошо известный в узких кругах.<br>
Аппаратный сброс на микроконтроллер подаётся от генератора постоянно.<br>
Во временном промежутками между сбросами контроллер и выполняет<br>
всю работу. Такая вычислительная система не может зависнуть...<br>
-----<br>
Ты преподавателем работаешь ? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-07T11:50:00+00:00">07.02.20, 11:50</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820592'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-07T11:36:12+00:00">07.02.20, 11:36</time></span><div class='quote '>Любое нормально работающее нормальное приложение имеет штатный режим завершения работы.</div></div><br>
А я тебе и ответил - что в штатном режиме Terminate и не используется.<br>
Это предохранитель на не предвиденную ситуацию и не штатный режим.<br>
Который всегда может возникнуть в любой момент.<br>
В том числе и по прямой ошибке программиста.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820592</guid>
        <pubDate>Fri, 07 Feb 2020 11:36:12 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820592</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>ЫукпШ</strong>, ты комп тоже reset-ом ребутаешь? Ненуачё, а вдруг какая-то аппликуха откажется отвечать, какой-то драйвер не отпустит свою шелезяку... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-07T11:44:14+00:00">07.02.20, 11:44</time></span></span><br>
Любое нормально работающее нормальное приложение имеет штатный режим завершения работы. Пользователь ими вполне пользуется. Ты же наверняка не запускаешь таск-менеджер и прибиваешь аппликуху из списка процессов каждый раз? Почему тогда советуешь другим программно делать именно так? Давно Рихтера открывал? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-07T11:46:01+00:00">07.02.20, 11:46</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820519'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T20:56:34+00:00">06.02.20, 20:56</time></span><div class='quote '>Terminate - не так уж редко нужно.</div></div>Никогда не нужно. Ею  должен пользоваться <strong class='tag-b'>только</strong> пользователь только из <strong class='tag-b'>таск-менеджера</strong>.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820568</guid>
        <pubDate>Fri, 07 Feb 2020 06:56:54 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820568</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820508'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T20:10:40+00:00">06.02.20, 20:10</time></span><div class='quote '>я несколько подправил класс &quot;cmdShell&quot;</div></div>Спасибо большое, буду разбираться.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820519</guid>
        <pubDate>Thu, 06 Feb 2020 20:56:34 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820519</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820517'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T20:39:27+00:00">06.02.20, 20:39</time></span><div class='quote '>TerminateProcess()... абажаю. В чём проблема была послать ему &quot;quit()&quot;?</div></div><br>
Допустим, произошла ошибка при пользовании<br>
Питоном.<br>
Юзер забыл послать ему &quot;exit()&quot;.<br>
Ещё интереснее получится, если вообще произойдут какие-то ошибки<br>
(в процессе отладки нашего приложения) и у нас останется висеть запущенный<br>
процесс Питона.<br>
А мы завершим работу своего приложения.<br>
И задумаем его перезапустить.<br>
А это не получится - дочерний процесс уже запущен. &quot;Это фиаско, братан&quot; &copy;<br>
Или получится, но мы не сразу обнаружим вышеупомянутую ошибку<br>
и начнём плодить &quot;потерянные&quot; процессы массово.<br>
Terminate - это просто предохранитель.<br>
Если Питон заканчивает работу штатным образом<br>
посредством &quot;exit()&quot;, Terminate фактически ничего и не делает.<br>
---<br>
Terminate - не так уж редко нужно.<br>
---<br>
На самом деле это решение можно критиковать с другой стороны.<br>
Просто для упрощения примера я использовал такую реализацию.<br>
Предположим, что Питон сам начал запускать различные приложения<br>
для своей работы. Много различных процессов.<br>
Так вот, нужно перечислить и грохнуть их все.<br>
Иначе в результате любой аварии получится неудобная проблема.<br>
Более корректный вариант у меня такой:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell::UnInstall(size_t dwTout)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool RetC=false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if((bInstalled)&amp;&amp;(pExit))</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;RetC = WriteToPipe(pExit);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(!WaitProcess((DWORD)dwTout))</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; BOOL bRKPEX = KillChildProcessesEx();</div><div class="code_line">&nbsp;&nbsp; if(!bRKPEX) RetC = false;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;else</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;if(!KillChildProcessesEx()) RetC = false;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;bInstalled = false;</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820518</guid>
        <pubDate>Thu, 06 Feb 2020 20:40:45 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820518</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820517'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T20:39:27+00:00">06.02.20, 20:39</time></span><div class='quote '>TerminateProcess()... абажаю.</div></div><br>
 :lool:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820517</guid>
        <pubDate>Thu, 06 Feb 2020 20:39:27 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820517</link>
        <description><![CDATA[Qraizer: TerminateProcess()... абажаю. В чём проблема была послать ему &quot;quit()&quot;?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820508</guid>
        <pubDate>Thu, 06 Feb 2020 20:10:40 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820508</link>
        <description><![CDATA[ЫукпШ: я несколько подправил класс &quot;cmdShell&quot;, и максимально возможно выполнил<br>
его внутренности в стиле твоей программы.<br>
В итоге получилось так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;cmdShell_b.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">bool WriteToPython(cmdShell_b&amp; cSh, const char* pStr)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool bRetC=false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;size_t sizeWr = strlen(pStr);</div><div class="code_line">&nbsp;if(sizeWr)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;if(!cSh.WriteToPipe (pStr,sizeWr)) return false;</div><div class="code_line">&nbsp;} </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;MEMT&#60;char&#62; buf;</div><div class="code_line">&nbsp;bRetC = cSh.ReadFromPipe &nbsp;(buf);</div><div class="code_line">&nbsp;size_t size = buf.GetDataSize();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if((bRetC)&amp;&amp;(size))</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;for(size_t i=0;i&#60;size;++i) { _tprintf(_T(&quot;%c&quot;),buf[i]); }</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;_tprintf(_T(&quot;\n&quot;));</div><div class="code_line">&nbsp;return bRetC;</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">int __cdecl _tmain(int argc, char **argv)</div><div class="code_line">{</div><div class="code_line">&nbsp;_tprintf(_T(&quot;\tHello, world!\n&quot;)); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;cmdShell_b cSh;</div><div class="code_line">&nbsp;&nbsp;bool bRetC = cSh.Install(_T(&quot;python -i&quot;));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(bRetC)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;&quot;);</div><div class="code_line">// пишем файл aa.txt в папку d:{text}</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f=open(\&quot;d:\\0\\aa.txt\&quot;,\&quot;w+\&quot;)\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f.write(\&quot;223\&quot;)\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f.close()\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;exit()\n&quot;);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; _tprintf(_T(&quot;bRetC(install)=%d\n&quot;),bRetC);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Где:<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
<br>
Файл cmdShell_b.h :<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">// file cmdShell_b.h &nbsp;2020.02.06</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">#ifndef __cmdShell_b_H__</div><div class="code_line">#define __cmdShell_b_H__</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">//#include &quot;TypeDebugString.h&quot;</div><div class="code_line">#include &quot;memt.h&quot;</div><div class="code_line">#include &quot;mpipe.h&quot;</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">// DbgStr::TypeDebugString(_T(&quot;%s bConnected=%d&quot;),_T(__FUNCTION__), bConnected);</div><div class="code_line">// DbgStr::TypeDebugString(_T(&quot;%s buf.GetDataSize()=%d&quot;),_T(__FUNCTION__), buf.GetDataSize());</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">class cmdShell_b</div><div class="code_line">{</div><div class="code_line">&nbsp;public:</div><div class="code_line">&nbsp;</div><div class="code_line">static const size_t TOUT_DEF_ms &nbsp; &nbsp; = 3000;</div><div class="code_line">static const size_t TOUT_DEF_GET_ms = 250;</div><div class="code_line">static const size_t SIZE_IN &nbsp; &nbsp; &nbsp; &nbsp; = 128*1024;</div><div class="code_line">static const size_t SIZE_PROXY_IN &nbsp; = SIZE_IN;</div><div class="code_line">&nbsp;</div><div class="code_line">static const size_t MAX_COMMLINE_BUFF = 32768;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;private:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;protected:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bool &nbsp; &nbsp; &nbsp; bInstalled;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MEMT&#60;char&#62; proxyIn;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MPIPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; In,Out;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;STARTUPINFO &nbsp; &nbsp; &nbsp; &nbsp; si;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;PROCESS_INFORMATION pi;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TCHAR commLineBuff &nbsp;[MAX_COMMLINE_BUFF];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dwSizeIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dwSizeOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t &nbsp; &nbsp; sizePipeInBuf;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI WaitPipeData &nbsp; &nbsp; (size_t dwToutWait=TOUT_DEF_ms,DWORD* pdwSize=NULL);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI GetPipeData &nbsp; &nbsp; &nbsp;(MEMT&#60;char&#62;&amp; buf, DWORD dwGot=0, size_t dwToutGet=TOUT_DEF_GET_ms);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI ReadPipe &nbsp; &nbsp; &nbsp; &nbsp; (bool RetBefore, MEMT&#60;char&#62;&amp; buf, DWORD dwSize);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI AddData &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(MEMT&#60;char&#62;&amp; tar, MEMT&#60;char&#62;&amp; sou);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI CreatePipes &nbsp; &nbsp; &nbsp;(void);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI PipesExist &nbsp; &nbsp; &nbsp; (void); </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI Wait__Process &nbsp; &nbsp;(DWORD tout);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI Check__Pipe &nbsp; &nbsp; &nbsp;(DWORD *pAvail); &nbsp; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI Read__Pipe &nbsp; &nbsp; &nbsp; (char *pData,DWORD size,DWORD *pGot);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI Write__Pipe &nbsp; &nbsp; &nbsp;(char *pData,DWORD size,DWORD *pOut); &nbsp; </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WINAPI cmdShell_b &nbsp; &nbsp; &nbsp;(void);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp; &nbsp; &nbsp; WINAPI ~cmdShell_b &nbsp; &nbsp; (void); &nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; void WINAPI PreSetPipeInSize (size_t size);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI Install &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(const TCHAR* pCommLine);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI WriteToPipe &nbsp; &nbsp; &nbsp;(const void* pB, size_t size=0);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI WriteToPipe &nbsp; &nbsp; &nbsp;(MEMT&#60;char&#62;&amp; buf);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI ReadFromPipe &nbsp; &nbsp; (MEMT&#60;char&#62;&amp; buf, size_t dwToutWait=TOUT_DEF_ms, size_t dwToutGet=TOUT_DEF_GET_ms);</div><div class="code_line">&nbsp;&nbsp;virtual &nbsp;bool WINAPI WriteWaitRead &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;const void* pB, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t &nbsp; &nbsp; &nbsp;size, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MEMT&#60;char&#62;&amp; buf, &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t &nbsp; &nbsp; &nbsp;dwToutWait &nbsp;= TOUT_DEF_ms, </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t &nbsp; &nbsp; &nbsp;dwToutGet &nbsp; = TOUT_DEF_GET_ms</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; );</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI UnInstall &nbsp; &nbsp; &nbsp; (void);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bool WINAPI Terminate &nbsp; &nbsp; &nbsp; (UINT uiCode);</div><div class="code_line">};</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
Файл cmdShell_b.cpp :<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">// &nbsp; FILE cmdShell_b.cpp 2020.02.05</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">#include &quot;stdafx.h&quot;</div><div class="code_line">#include &quot;cmdShell_b.h&quot;</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">WINAPI cmdShell_b::cmdShell_b () :</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwSizeIn &nbsp; &nbsp; &nbsp; &nbsp; (0),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwSizeOut &nbsp; &nbsp; &nbsp; &nbsp;(0),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;bInstalled &nbsp; &nbsp; &nbsp; (false),</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sizePipeInBuf &nbsp; &nbsp;(SIZE_IN)</div><div class="code_line">{</div><div class="code_line">&nbsp;::ZeroMemory(&amp;si, sizeof(si));</div><div class="code_line">&nbsp;::ZeroMemory(&amp;pi, sizeof(pi));</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">WINAPI cmdShell_b::~cmdShell_b () &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;UnInstall();</div><div class="code_line">&nbsp;if(pi.hProcess) {::CloseHandle(pi.hProcess);}</div><div class="code_line">&nbsp;if(pi.hThread) &nbsp;{::CloseHandle(pi.hThread);}</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">void WINAPI cmdShell_b::PreSetPipeInSize (size_t size) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">{</div><div class="code_line">&nbsp;if(size &#60; SIZE_IN) size = SIZE_IN;</div><div class="code_line">&nbsp;sizePipeInBuf = size;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Install(const TCHAR* pCommLine)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!pCommLine) return false;</div><div class="code_line">&nbsp;if(bInstalled) return false;</div><div class="code_line">&nbsp;if(!proxyIn.Alloc(SIZE_PROXY_IN)) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;dwSizeIn = (DWORD)sizePipeInBuf;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(!CreatePipes ()) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;::ZeroMemory(&amp;si, sizeof(si)); &nbsp;si.cb = sizeof(si);</div><div class="code_line">&nbsp;::ZeroMemory(&amp;pi, sizeof(pi));</div><div class="code_line">&nbsp;::GetStartupInfo(&amp;si);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;</div><div class="code_line">&nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;si.hStdOutput &nbsp;= In.GetWriteHandle();</div><div class="code_line">&nbsp;si.hStdError &nbsp; = In.GetWriteHandle(); &nbsp; //подменяем дескрипторы для</div><div class="code_line">&nbsp;si.hStdInput &nbsp; = Out.GetReadHandle(); &nbsp;// дочернего процесса</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;_sntprintf_s(commLineBuff,ARRAYSIZE(commLineBuff),_TRUNCATE,_T(&quot;%s&quot;),pCommLine);</div><div class="code_line">// DbgStr::TypeDebugString(_T(&quot;%s %s&quot;),_T(__FUNCTION__), commLineBuff);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if</div><div class="code_line">&nbsp;&nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; !::CreateProcess</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; commLineBuff,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; TRUE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; CREATE_NEW_CONSOLE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; NULL,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &amp;si,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &amp;pi</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;)</div><div class="code_line">&nbsp;&nbsp; &nbsp;) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;bInstalled = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return true;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::WriteToPipe(const void* pB, size_t size)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!bInstalled) return false;</div><div class="code_line">&nbsp;if(!pB) &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;const char* pBuf = (const char*) pB;</div><div class="code_line">&nbsp;if(size==0) size=strlen(pBuf);</div><div class="code_line">&nbsp;DWORD out=0;</div><div class="code_line">&nbsp;bool RetC = false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;RetC = Write__Pipe ((char*)pBuf, (DWORD)size, &amp;out);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::WriteToPipe(MEMT&#60;char&#62;&amp; buf)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(buf.GetDataSize()==0) return false;</div><div class="code_line">&nbsp;return WriteToPipe(buf.GetPointer(), buf.GetDataSize());</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::ReadFromPipe(MEMT&#60;char&#62;&amp; buf, size_t dwToutWait, size_t dwToutGet)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!bInstalled) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;bool RetC &nbsp; &nbsp;= false;</div><div class="code_line">&nbsp;DWORD dwSize = 0;</div><div class="code_line">&nbsp;buf.SetDataSize(0);</div><div class="code_line">&nbsp;for(int ii=0;ii==0;++ii,RetC=true)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;if(!WaitPipeData(dwToutWait, &amp;dwSize)) break;</div><div class="code_line">&nbsp;&nbsp;if(!GetPipeData(buf, dwSize, dwToutGet)) break;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::WriteWaitRead(const void* pB, size_t size, MEMT&#60;char&#62;&amp; buf, size_t dwToutWait, size_t dwToutGet)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool RetC = false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;for(int ii=0;ii==0;++ii,RetC=true)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;if(pB)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; if(!WriteToPipe(pB, size)) break;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;if(!ReadFromPipe(buf, dwToutWait, dwToutGet)) break;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::UnInstall(void)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!bInstalled) return false;</div><div class="code_line">&nbsp;bool RetC=false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;RetC = Terminate (0);</div><div class="code_line">&nbsp;bInstalled = false;</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">// bRetC = exb.ExecBatFile(_T(&quot;plink -ssh hostOrIp -P port -l user -pw password&quot;));</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::WaitPipeData(size_t dwToutWait, DWORD* pdwSize)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool RetC=false;</div><div class="code_line">&nbsp;DWORD dwSize=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(pdwSize){*pdwSize=0;}</div><div class="code_line">&nbsp;for(size_t i=0;i&#60;dwToutWait;++i)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;::Sleep(1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Wait__Process(0)) break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Check__Pipe (&amp;dwSize))</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; if(dwSize==0) continue;</div><div class="code_line">&nbsp;&nbsp; else </div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;RetC=true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(pdwSize){*pdwSize=dwSize;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::GetPipeData(MEMT&#60;char&#62;&amp; buf, DWORD dwGot_, size_t dwToutGet)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool RetC &nbsp; &nbsp;= false;</div><div class="code_line">&nbsp;DWORD dwSize = 0;</div><div class="code_line">&nbsp;DWORD dwGot &nbsp;= dwGot_;</div><div class="code_line">&nbsp;if(dwGot) RetC = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;for(size_t i=0;i&#60;dwToutGet;++i)</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;::Sleep(1);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Wait__Process(0)) break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Check__Pipe (&amp;dwSize))</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; if(dwSize==0) {RetC=false; break;}</div><div class="code_line">&nbsp;&nbsp; else </div><div class="code_line">&nbsp;&nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(dwSize &#62; dwGot) </div><div class="code_line">&nbsp;&nbsp; &nbsp;{ </div><div class="code_line">&nbsp;&nbsp; &nbsp; RetC=true; dwGot=dwSize; i=0; </div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else {RetC=false;break;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;RetC = ReadPipe(RetC, buf, dwGot);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return RetC;</div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::ReadPipe(bool RetBefore, MEMT&#60;char&#62;&amp; buf, DWORD dwSize)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!RetBefore) return false;</div><div class="code_line">&nbsp;if(!buf.Alloc((size_t)dwSize*2)) return false;</div><div class="code_line">&nbsp;buf.MemSet(0);</div><div class="code_line">&nbsp;if(!buf.SetDataSize(0)) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;DWORD dwGot=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(!Read__Pipe (buf.GetPointer(), (DWORD)buf.GetSize(), &amp;dwGot)) return false;</div><div class="code_line">&nbsp;if(!buf.SetDataSize((size_t)dwGot)) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return true; </div><div class="code_line">}</div><div class="code_line">// ---------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::AddData(MEMT&#60;char&#62;&amp; tar, MEMT&#60;char&#62;&amp; sou)</div><div class="code_line">{</div><div class="code_line">&nbsp;size_t sizetar = tar.GetDataSize();</div><div class="code_line">&nbsp;size_t sizesou = sou.GetDataSize();</div><div class="code_line">&nbsp;size_t sizeres = sizetar+sizesou;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(sizeres==0) {tar.SetDataSize(0); return true;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;MEMT&#60;char&#62; tmp; if(!tmp.Alloc(sizeres)) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;size_t ind = 0;</div><div class="code_line">&nbsp;for(size_t i=0;i&#60;sizetar;++i){ tmp[ind++]=tar[i]; }</div><div class="code_line">&nbsp;for(size_t i=0;i&#60;sizesou;++i){ tmp[ind++]=sou[i]; }</div><div class="code_line">&nbsp;tmp.SetDataSize(sizeres);</div><div class="code_line">&nbsp;tar = tmp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return true;</div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::CreatePipes (void) </div><div class="code_line">{</div><div class="code_line">&nbsp;if(PipesExist ()) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(!In. Create(dwSizeIn)) return false;</div><div class="code_line">&nbsp;if(!Out.Create(dwSizeOut))return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return true;</div><div class="code_line">} </div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::PipesExist (void) </div><div class="code_line">{</div><div class="code_line">&nbsp;bool rIn &nbsp;= In.PipeExist();</div><div class="code_line">&nbsp;bool rOut = Out.PipeExist();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;return (rIn &amp;&amp; rOut);</div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Wait__Process (DWORD tout) &nbsp; </div><div class="code_line">{</div><div class="code_line">&nbsp;DWORD RetC = ::WaitForSingleObject(pi.hProcess, tout);</div><div class="code_line">&nbsp;if(RetC==WAIT_OBJECT_0) return true;</div><div class="code_line">&nbsp;return false;</div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Check__Pipe (DWORD *pAvail) &nbsp; </div><div class="code_line">{</div><div class="code_line">&nbsp;return In.CheckPipe(pAvail); &nbsp; </div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Read__Pipe (char *pData,DWORD size,DWORD *pGot) &nbsp; </div><div class="code_line">{</div><div class="code_line">&nbsp;return In.ReadPipe(pData,size,pGot); &nbsp; </div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Write__Pipe (char *pData,DWORD size,DWORD *pOut) &nbsp; </div><div class="code_line">{</div><div class="code_line">&nbsp;return Out.WritePipe(pData,size,pOut); &nbsp; </div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI cmdShell_b::Terminate (UINT uiCode)</div><div class="code_line">{</div><div class="code_line">&nbsp;if(!bInstalled) return false;</div><div class="code_line">&nbsp;if(!pi.hProcess) return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(::TerminateProcess(pi.hProcess, uiCode)) return true;</div><div class="code_line">&nbsp;return false;</div><div class="code_line">}</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">// &nbsp;DbgStr::TypeDebugString(_T(&quot;%s WaitProcess bRet=%d&quot;),_T(__FUNCTION__),bRet);</div><div class="code_line">// ---------------------------------------------------------------------------------</div></ol></div></div></div></div><br>
</div></div><br>
Пробовал только для x86, но сборка x64 у меня тоже есть.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820491</guid>
        <pubDate>Thu, 06 Feb 2020 16:37:16 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820491</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820486'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T16:05:47+00:00">06.02.20, 16:05</time></span><div class='quote '>для ответов делай именованный пайп</div></div>Вроде, для чтения использую PeekNamedPipe, как во многих примерах.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820487</guid>
        <pubDate>Thu, 06 Feb 2020 16:06:02 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820487</link>
        <description><![CDATA[Qraizer: Кстати да, а попробуй именованные.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820486</guid>
        <pubDate>Thu, 06 Feb 2020 16:05:47 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820486</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820485'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T15:59:34+00:00">06.02.20, 15:59</time></span><div class='quote '>Питона тоже не знаю. </div></div><br>
Ну <a class='tag-url' href='https://habr.com/ru/post/221937/' target='_blank'>сверскоростное гугление</a> говорит, что eval() в Питоне есть. Так что &quot;принимающий скрипт&quot; можешь писать по образу и подобию моего next.pl, и Питон будет висеть в памяти и читать что ему определишь. А вот для ответов делай именованный пайп.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820485</guid>
        <pubDate>Thu, 06 Feb 2020 15:59:34 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820485</link>
        <description><![CDATA[vlad2: Спасибо, <strong class='tag-b'>JoeUser</strong>. Питона тоже не знаю. Мне нужно из внешней программы периодически (не одним скриптом) давать команды Питону и читать его ответы, если они есть. Питон во время всех этих действий должен находиться в памяти. Тоже создаю два пайпа, как написано во многих примерах, правда анонимных...]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820471</guid>
        <pubDate>Thu, 06 Feb 2020 12:55:25 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820471</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819732'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T07:52:38+00:00">30.01.20, 07:52</time></span><div class='quote '>Как выполнять команды и читать из командной строки консольного приложения без закрытия самого приложения?<br>
Спасибо.</div></div><br>
Начнем с того, что термин &quot;конвеер&quot; (pipe)  - это однонаправленный канал межпроцессного взаимодействия. Таким образом, одна программа пишет в STDOUT, вторая программа читает из STDIN, и что-то делает. Что делать чтобы вторая программа не закрывалась? Ответ простой - читать STDIN в бесконечном цикле, с возможностью выхода по условию. Увы, но не к сожалению, я Питона не знаю, приведу пример на Перле:<br>
<br>
first.pl<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#/usr/local/bin/perl</div><div class="code_line">$| = 1; # flush сразу после очередной операции I/O</div><div class="code_line">print &quot;print 1;\n&quot;;</div><div class="code_line">print &quot;print 2;\n&quot;;</div><div class="code_line">sleep(2);</div><div class="code_line">print &quot;print 3;\n&quot;;</div><div class="code_line">sleep(4);</div><div class="code_line">print &quot;print 4;\n&quot;;</div><div class="code_line">print &quot;EXIT\n&quot;;</div></ol></div></div></div></div><br>
next.pl<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#/usr/local/bin/perl</div><div class="code_line">$| = 1; &nbsp;# flush сразу после очередной операции I/O</div><div class="code_line">while(1) {</div><div class="code_line">&nbsp;&nbsp;$in = &#60;STDIN&#62;;</div><div class="code_line">&nbsp;&nbsp;last if ($in =~ /^EXIT\s*$/);</div><div class="code_line">&nbsp;&nbsp;eval($in);</div><div class="code_line">}</div></ol></div></div></div></div><br>
Тест запускаем так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">perl first.pl | perl next.pl</div></ol></div></div></div></div><br>
В результате первые две команды будут прочитаны и сразу выполнены - выведутся два числа 1 и 2. Потом задержка. Потом вывод числа 3. Потом еще одна задержка. Потом вывод числа 4 и вторая программа &quot;ловит&quot; условие выхода &quot;EXIT&quot;, и выполнение завершается.<br>
<br>
<strong class='tag-b'>Сценарий интерпретаторов, что Перла, что Питона - одинаков. Выполнить скрипт и завершится.</strong> Вот Перлу приходит на помощь функция eval(), которая выполняет как код переданную ей строку в качестве аргумента. Может ли такое Питон - я не знаю.<br>
<br>
Далее. Если нужен двусторонний обмен, вангую - нужно определить два именованных пайпа. Для одной программы один канал для записи, второй для чтения. Для второй программы каналы меняются местами. Тогда взаимодействие программ не будет зависеть на каком из терминалов запущены программы.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820455</guid>
        <pubDate>Thu, 06 Feb 2020 11:13:15 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820455</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820450'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T11:01:08+00:00">06.02.20, 11:01</time></span><div class='quote '>Да, но только вечером или ночью.</div></div>Спасибо, отлично. <br>
Максимально упростил свой код, чтобы оценить возможность. Чтобы написать оперативную прогу, буду ориентироваться на твой подход, который считаю совершенно верным.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820450</guid>
        <pubDate>Thu, 06 Feb 2020 11:01:08 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820450</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820446'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T10:38:34+00:00">06.02.20, 10:38</time></span><div class='quote '>Можешь посмотреть мой код на предмет ошибки или дать свой, который работает?</div></div><br>
Да, но только вечером или ночью.<br>
---<br>
Но я делал не так, как ты.<br>
Чтобы мастерить такие приложения на постоянной основе,<br>
я сделал некоторые классы и процедуры, которые занёс в библиотеку.<br>
Поэтому исходников получается не один.<br>
Но зато растёт производительность труда.<br>
<br>
1. Делаем класс - Hahdle. Это весьма нужный класс.<br>
2. Делаем класс - Pipe.<br>
3. Делаем класс - Обёртку процесса для консольных приложений и .bat файлов.<br>
4. Для удобства - обёртку вокруг памяти.<br>
5. Класс - конвертор форматов<br>
6. Делаем класс - обёртку для управления консольным приложением<br>
  На основе сделанного набора<br>
И ещё там чего-то в виде библиотечных процедур.<br>
В результате получился такой исходник:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &quot;cmdShell.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">bool WriteToPython(cmdShell&amp; cSh, const char* pStr)</div><div class="code_line">{</div><div class="code_line">&nbsp;bool bRetC=false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;size_t sizeWr = strlen(pStr);</div><div class="code_line">&nbsp;if(sizeWr)</div><div class="code_line">&nbsp;{</div><div class="code_line">// &nbsp;ConvTchar2Char conv;</div><div class="code_line">// &nbsp;DbgStr::TypeDebugString(_T(&quot;%s %s&quot;),_T(__FUNCTION__), conv.Char2Tchar(pStr));</div><div class="code_line">&nbsp;&nbsp;if(!cSh.WriteToPipe (pStr,sizeWr)) return false;</div><div class="code_line">&nbsp;} </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;MEMT&#60;char&#62; buf;</div><div class="code_line">&nbsp;bRetC = cSh.ReadFromPipe &nbsp;(buf);</div><div class="code_line">&nbsp;size_t size = buf.GetDataSize();</div><div class="code_line">&nbsp;</div><div class="code_line">// _tprintf(_T(&quot;bRetC(ReadFromPipe)=%d size=%d\n&quot;),bRetC,size);</div><div class="code_line">&nbsp;if((bRetC)&amp;&amp;(size))</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;for(size_t i=0;i&#60;size;++i) { _tprintf(_T(&quot;%c&quot;),buf[i]); }</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;_tprintf(_T(&quot;\n&quot;));</div><div class="code_line">&nbsp;return bRetC;</div><div class="code_line">}</div><div class="code_line">// --------------------------------------------------------------------------</div><div class="code_line">int __cdecl _tmain(int argc, char **argv)</div><div class="code_line">{</div><div class="code_line">&nbsp;_tprintf(_T(&quot;\tHello, world!\n&quot;)); </div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;cmdShell cSh;</div><div class="code_line">&nbsp;&nbsp;bool bRetC = cSh.Install(&quot;python -i&quot;);</div><div class="code_line">&nbsp;&nbsp;if(bRetC)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;&quot;);</div><div class="code_line">// создаём файл aa.txt в папке d:{text}</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f=open(\&quot;d:\\0\\aa.txt\&quot;,\&quot;w+\&quot;)\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f.write(\&quot;223\&quot;)\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;f.close()\n&quot;);</div><div class="code_line">&nbsp;&nbsp; WriteToPython(cSh, &quot;exit()\n&quot;);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; _tprintf(_T(&quot;bRetC(install)=%d\n&quot;),bRetC);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Приаттаченные исходники я надёргал из библиотеки, что-то мог и забыть.<br>
<span class="b-attach" data-size="10284" data-hits="378" data-attach-id="61371" data-attach-post-id="3820450">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=3820450&amp;attach_id=61371' title='Скачать файл' target='_blank'>ForPython.zip</a> (, : 378)
		</span>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820446</guid>
        <pubDate>Thu, 06 Feb 2020 10:38:34 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820446</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820438'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-02-06T09:37:48+00:00">06.02.20, 09:37</time></span><div class='quote '>А у меня всё получилось</div></div><br>
Здорово&#33; Я упростил код, убрал DuplicateHandle:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;UnicodeString Cons_App = L&quot;Python -i&quot;;</div><div class="code_line">&nbsp;&nbsp;HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SECURITY_ATTRIBUTES sa;</div><div class="code_line">&nbsp;&nbsp;PROCESS_INFORMATION pi;</div><div class="code_line">&nbsp;&nbsp;STARTUPINFO si;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;sa, sizeof(SECURITY_ATTRIBUTES));</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.bInheritHandle = TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.lpSecurityDescriptor = NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadOut, &amp;hWriteOut, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadIn, &amp;hWriteIn, &amp;sa, NULL);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;si, sizeof(STARTUPINFO));</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.cb=sizeof(STARTUPINFO);</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdInput &nbsp; = hReadIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdOutput &nbsp;= hWriteOut;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdError &nbsp; = hWriteOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &amp;si, &amp;pi);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD count = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buf[1024];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f= open(\&quot;D:\__aa.txt\&quot;,\&quot;w+\&quot;)\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteIn, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;создание файла</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f.write(\&quot;1\n\&quot;)\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteIn, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;запись в файл &quot;1\n&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD cread = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &nbsp;чтение</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool ret = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(int i=0; i &#60; 10; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = PeekNamedPipe(hWriteOut, NULL, 0, NULL, &amp;count, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = ret &amp;&amp; (count &#62; 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret) break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sleep(1000);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ret)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (count &#62; strlen(buf)) count = strlen(buf);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = ReadFile(hWriteOut, buf, count, &amp;cread, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f.close()\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteIn, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;закрытие файла</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;exit()\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteIn, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;выход из Питона</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadIn);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hProcess);</div></ol></div></div></div></div><br>
Всё равно не записывает в файл и не читает. Остальные команды проходят.<br>
Можешь посмотреть мой код на предмет ошибки или дать свой, который работает?]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820438</guid>
        <pubDate>Thu, 06 Feb 2020 09:37:48 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820438</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820376'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-02-05T16:09:53+00:00">05.02.20, 16:09</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820375'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-05T15:46:35+00:00">05.02.20, 15:46</time></span><div class='quote '>Думаю, такое веселье никому не понравится</div></div>Это точно(.</div></div><br>
А у меня всё получилось - после &quot;python -i&quot;. <br>
Только я делал для x86.<br>
Где то у тебя ошибка.<br>
---<br>
А вот этого я не делал никогда.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">...</div><div class="code_line">&nbsp;DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &amp;hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">...</div><div class="code_line">&nbsp;DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &amp;hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">...</div></ol></div></div></div></div>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820376</guid>
        <pubDate>Wed, 05 Feb 2020 16:09:53 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820376</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820375'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-05T15:46:35+00:00">05.02.20, 15:46</time></span><div class='quote '>Думаю, такое веселье никому не понравится</div></div>Это точно(.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820375</guid>
        <pubDate>Wed, 05 Feb 2020 15:46:35 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820375</link>
        <description><![CDATA[Qraizer: У меня 3.8.1. Поведение отличается.<br>Короче, долби саппорт питона. Боюсь, без их помощи не обойтись. Тебе вот надо, чтобы твой код под каждую версию работал по-разному? Думаю, такое веселье никому не понравится.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820368</guid>
        <pubDate>Wed, 05 Feb 2020 13:51:25 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820368</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820364'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-02-05T12:50:37+00:00">05.02.20, 12:50</time></span><div class='quote '>А с чего ты уверен, что команды туда приходят?</div></div><br>
Файл образуется (f=open) и закрывается (f.close). <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-05T13:52:06+00:00">05.02.20, 13:52</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3820368'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-02-05T13:51:25+00:00">05.02.20, 13:51</time></span><div class='quote '>без этого дурацкого ветвления по типу tty</div></div><br>
Что имеется в виду? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-02-05T14:01:28+00:00">05.02.20, 14:01</time></span></span><br>
В сообщении #8 давал ссылку на Питон. Запускать его надо с опцией -i.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820364</guid>
        <pubDate>Wed, 05 Feb 2020 12:50:37 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820364</link>
        <description><![CDATA[Qraizer: А с чего ты уверен, что команды туда приходят? Я ради такого случая поставил себе Python, не факт, что твоей версии, правда, и ничего работающего не обнаружил. Написал свою простейшую аппликуху, без этого дурацкого ветвления по типу tty, и в ней всё работает как часы, в обе стороны.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820259</guid>
        <pubDate>Tue, 04 Feb 2020 13:43:59 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3820259</link>
        <description><![CDATA[vlad2: В результате получилась запись, но не получается чтение. Вот рабочий код:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;UnicodeString Cons_App = L&quot;Python -i&quot;;</div><div class="code_line">&nbsp;&nbsp;HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SECURITY_ATTRIBUTES sa;</div><div class="code_line">&nbsp;&nbsp;PROCESS_INFORMATION pi;</div><div class="code_line">&nbsp;&nbsp;STARTUPINFO si;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetCurrentDir(CurDir);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;sa, sizeof(SECURITY_ATTRIBUTES));</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.bInheritHandle = TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.lpSecurityDescriptor = NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadOut, &amp;hWriteOut, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &amp;hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadIn, &amp;hWriteIn, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &amp;hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;si, sizeof(STARTUPINFO));</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.cb=sizeof(STARTUPINFO);</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdInput &nbsp; = hReadIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdOutput &nbsp;= hWriteOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &amp;si, &amp;pi);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD count = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buf[1024];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f= open(\&quot;D:\__aa.txt\&quot;,\&quot;w+\&quot;)\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;создание файла</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f.write(\&quot;1\n\&quot;)\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;запись в файл &quot;1\n&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD cread = 0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;чтение</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool ret = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;for(int i=0; i &#60; 10; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = PeekNamedPipe(hWriteOutDup, NULL, 0, NULL, &amp;count, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = ret &amp;&amp; (count &#62; 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (ret) break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sleep(1000);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ret)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ret = ReadFile(hWriteOutDup, buf, count, &amp;cread, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;while (ret)</div><div class="code_line">// &nbsp;{</div><div class="code_line">// &nbsp; &nbsp;ret = ReadFile(hWriteOutDup, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;read from the pipe</div><div class="code_line">// &nbsp; &nbsp;if (!ret &amp;&amp; GetLastError() != ERROR_MORE_DATA)</div><div class="code_line">// &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">// &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buf,&quot;f.close()\r\n&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, strlen(buf), &amp;count, NULL); &nbsp; // &nbsp;закрытие файла</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteInDup);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hProcess);</div></ol></div></div></div></div><br>
Результат PeekNamedPipe - всегда false.<br>
Те же действия в командной строке нормально работают - см. вложение. Как программно реализовать чтение?<br>
<span class="b-attach" data-size="7624" data-hits="7289" data-attach-id="61366" data-attach-post-id="0">
			<span class="b-attach__title"></span><a class='b-attach-link' href='https://forum.sources.ru/index.php?act=Attach&amp;type=post&amp;id=0&amp;attach_id=61366' title='Скачать файл' target='_blank'>cmd_p.jpg</a> (, : 7289)
		</span><br>
При этом команда записи в файл не проходит.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819901</guid>
        <pubDate>Sat, 01 Feb 2020 00:57:42 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819901</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819898'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T22:55:37+00:00">31.01.20, 22:55</time></span><div class='quote '>Наладь между grep и program двусторонний диалог. </div></div><br>
Ну я так понимаю, &quot;двусторонность&quot; не равна &quot;динамичности&quot;? Как я понимаю, динамичность может просто подразумевать какую-то зависимость исходящих величин  - от входящих (читай функцию). А если обобщить - рассматриваем не только способ обработки, но и его построение, читай - получаем что-то типа &quot;функтора&quot;. Хотя может я и загоняюсь  :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819898</guid>
        <pubDate>Fri, 31 Jan 2020 22:55:37 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819898</link>
        <description><![CDATA[Qraizer: И где тут динамика, <strong class='tag-b'>JoeUser</strong>? Наладь между grep и program двусторонний диалог.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819881</guid>
        <pubDate>Fri, 31 Jan 2020 18:49:55 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819881</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819880'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T18:40:04+00:00">31.01.20, 18:40</time></span><div class='quote '>Но оно статично. </div></div><br>
Ой ли ... ой лю ли ...  :lol: <br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">echo &quot;Oi li, oi lu li&quot; | program</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">cat myfile | program</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">ls /usr/local/bin | grep YO | program</div></ol></div></div></div></div><br>
<br>
&amp; etc ... &#33;&#33;&#33;<br>
<br>
Все наоборот&#33; Изначальная обработка может быть любая, но вывод в STDOUT будет одинаков. А вот как его отработает прога в STDIN - вопрос. ИМХО, И ящетаю - привязываться к  API Венды (именно в этом случае) - это кощунство и сатанинство&#33;&#33;&#33; И издевательство над православными&#33;]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819880</guid>
        <pubDate>Fri, 31 Jan 2020 18:40:04 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819880</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T11:24:48+00:00">31.01.20, 11:24</time></span><div class='quote '>Прочитал про особенность Питона с предложением, как обойти проблему.</div></div>Вообще говоря, за такие вещи нужно по рукам и розгами. Вот что в голове у этих иксоидов творится, что они с пеной у рта рассказывают, какая у них вся из себя унифицированная архитектура, всё суть файлы, даже внешние устройства, даже процессор и память, а на деле чекают, чё им подсунули и меняют алгоритмы. Какая тебе нафик разница, что у тебя с той стороны stdin-а? Зла не хватает, половина кроссплатформенного оперсорса более кроссплатформенен на винде, чем в позиксе... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T18:41:57+00:00">31.01.20, 18:41</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819879'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T18:36:33+00:00">31.01.20, 18:36</time></span><div class='quote '>Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно?</div></div>Это оно. Только оно для юзера. Оно программно как раз так и реализуется, через CreatePipe() etc. Только делает это оболочка. Ну, в винде это cmd. И ничего не надо программить. Но это решение статично. Если нужно динамически общаться, юзер не справится, ему придётся что-нить наскриптовать хотя бы.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819879</guid>
        <pubDate>Fri, 31 Jan 2020 18:36:33 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819879</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819877'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T18:33:12+00:00">31.01.20, 18:33</time></span><div class='quote '>Нет, сугубо программно.</div></div><br>
<strong class='tag-b'>Qraizer</strong>, стоп. Есть две программы. Пайп - это решение обмена, стандартизованное ОС. Если это не оно - то что оно? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T18:37:36+00:00">31.01.20, 18:37</time></span></span><br>
АДД: да, есть еще атавизмы в виде &quot;мэйл-слотов&quot;, но это явно не они.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819877</guid>
        <pubDate>Fri, 31 Jan 2020 18:33:12 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819877</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T18:31:20+00:00">31.01.20, 18:31</time></span><div class='quote '>Или как-то иначе??</div></div>Нет, сугубо программно. Но смысл ровно таков же с той лишь разницей, что пишуемое в пайп заранее неизвестно и формируется по ходу дела.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819876</guid>
        <pubDate>Fri, 31 Jan 2020 18:31:20 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819876</link>
        <description><![CDATA[JoeUser: Прани, сорри конечно ... но я совсем не вкурил, как производится запуск?<br>
<br>
Через сиспемный пайп?  Типа:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">proramm-1 | proramm-2</div></ol></div></div></div></div><br>
<br>
Или как-то иначе??]]></description>
        <author>JoeUser</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819874</guid>
        <pubDate>Fri, 31 Jan 2020 17:52:48 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819874</link>
        <description><![CDATA[Qraizer: Ну, в примере хватает не относящегося к записи в консоль, да. Просто это логически цельный фрагмент. Если из него что-то вырезать, то получится некорректно спроектированный код, хотя и решающий задачу.<br>
Давай сокращу чуть. Но учти, что опущенное тоже важно.<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;if (CreateProcess(NULL, &amp;commandLine.front(), NULL, NULL, TRUE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | BELOW_NORMAL_PRIORITY_CLASS,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL, NULL, &amp;startInfo, &amp;processInfo) == FALSE)</div><div class="code_line">&nbsp;&nbsp; &nbsp;/* сообщить об ошибке запуска менеджера */;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{ // при успехе запуска</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(processInfo.hThread); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // HANDLE нитки не нужен</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (/* проверяем, что менеджер не завершился сам по себе */ )</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (/* проверяем, что не поступило сигнала о принудительном завершении менеджера */) continue;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;/* Ок, сигналим менеджеру, чтоб выходил. Он это понимает, если ему в консоли нажали ESC.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Т.к. консольного окна мы его лишили, пишем ему туда ESC программно. */</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (!AttachConsole(processInfo.dwProcessId)) &nbsp; &nbsp; &nbsp;// присоединяемся к консоли менеджера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;/* сообщить об ошибке подачи сигнала менеджеру о выходе */;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp;written;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;INPUT_RECORD ev[2]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // создаём два события</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].EventType = ev[1].EventType = KEY_EVENT; &nbsp;// кнопочные</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.bKeyDown = TRUE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // нажали</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.bKeyDown = FALSE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отпустили</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= ev[1].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= 1;// ESC 1 раз</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualKeyCode = ev[1].Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualScanCode= 0x01; &nbsp; &nbsp;// скан коды ESC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.wVirtualScanCode= 0x81;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.uChar.AsciiChar = ev[1].Event.KeyEvent.uChar.AsciiChar = 27; // ASCII</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.dwControlKeyState=ev[1].Event.KeyEvent.dwControlKeyState=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// пишем в консоль два события</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), ev, 2, &amp;written))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/* сообщить об ошибке подачи сигнала менеджеру о выходе */;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FreeConsole(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отсоединяемся от консоли</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Ждём, пока менеджер не слопает ESC и выйдет</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (WaitForSingleObject(processInfo.hProcess, INFINITE) != WAIT_OBJECT_0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;/* вообще-то, тут баги быть не должно */;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(processInfo.hProcess); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// не забываем чистить ресурсы</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T18:24:17+00:00">31.01.20, 18:24</time></span></span><br>
Если хочется больше конкретики. Есть некий менеджер, который знает своё дело. Он является консольным приложением, его запустили, передав в командной строке параметры, остальные он берёт из окружения сам – и вперёд, на очередные несколько минут он занят работой. Потом завершается, положив в файлы и в консоль результаты и логи. Ещё он умеет по ESC прерываться досрочно. Я же представляю собой робота, который тихонько работает себе в фоне на этой же машине и никого не трогает. И его задача принимать сетевые запросы на обслуживание этим менеджером, формировать параметры командной строки для него, перенаправить его консольный вывод в файлы, усиленно перед этим процессом делая вид, что с ним работают как обычно через консоль. (Естественно, я привёл лишь малую часть кода.) Т.о. люди получают возможность работать на этой машине по сети, а не только непосредственно за ней или по RDP.<br>
Я запускаю дочерний процесс, который делает своё дело и выходит сам. Теоретически, я его и ждать-то не должен, запустил и хай работает себе. Но тут дело в том, что помимо сетевого запроса на запуск может прийти и запрос на прерывание ранее запущенного. Поэтому, во-первых, приходится ждать, пока менеджер не завершится сам, и если до этого времени пришёл запрос на его прерывание, передать ему эту команду. Как? Правильно, &quot;нажав&quot; ему ESC. Потому что таков штатный механизм прерывания.<br>
Неважно, как конкретно организован рабочий цикл с дочерним процессом. У меня вот так. Тебе, думаю, достаточно взять за основу вон ту подготовку пары событий по каждой кнопке и циклом фигачить эти пары туда не знаю куда. Как? Я не знаю всего твоего кода, обрамление уж на твоей совести. Поэтому на всякий случай и привёл часть моего обрамления, где есть... ну, важные моменты организации диалога.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819866</guid>
        <pubDate>Fri, 31 Jan 2020 14:23:42 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819866</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819848'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T12:05:43+00:00">31.01.20, 12:05</time></span><div class='quote '>Нашёл у себя пример</div></div>Пока довольно трудно разобраться.<br>
Видимо, для строки будет что-то типа:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;INPUT_RECORD ev[2]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // создаём два события</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].EventType = ev[1].EventType = KEY_EVENT; &nbsp;// кнопочные</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.bKeyDown = TRUE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // нажали</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.bKeyDown = FALSE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отпустили</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= ev[1].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= 1; &nbsp;// &nbsp;1 раз</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;AttachConsole(pi.dwProcessId); &nbsp; &nbsp; &nbsp;// присоединяемся к консоли менеджера</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;while (WaitForSingleObject(pi.hProcess, 1000) == WAIT_TIMEOUT)// пока менеджер работает</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (fs::exists(stop)) continue; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // досрочного стопа нет, продолжаем ждать &nbsp; &nbsp; &nbsp; &nbsp; ???</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Ок, прекращаем прогон</div><div class="code_line">// &nbsp; &nbsp; &nbsp; &nbsp;AttachConsole(pi.dwProcessId); &nbsp; &nbsp; &nbsp;// присоединяемся к консоли менеджера</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int k = 0; k &#60; sizeof(buf); ++k)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualKeyCode = ev[1].Event.KeyEvent.wVirtualKeyCode = BYTE(buf[k]);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualScanCode= VkKeyScan(buf[k]); &nbsp; &nbsp;// скан коды</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.wVirtualScanCode= 0x81; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;???</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.uChar.AsciiChar = ev[1].Event.KeyEvent.uChar.AsciiChar = 27; // ASCII &nbsp; &nbsp; &nbsp;// &nbsp;???</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.dwControlKeyState=ev[1].Event.KeyEvent.dwControlKeyState=0; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;???</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// пишем в консоль события</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), ev, 2, &amp;count);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FreeConsole(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отсоединяемся от консоли</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// Ждём завершения менеджера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_OBJECT_0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logMsg(&quot;UART manager failure&quot;, GetLastError());</div></ol></div></div></div></div>]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819853</guid>
        <pubDate>Fri, 31 Jan 2020 12:51:22 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819853</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819848'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T12:05:43+00:00">31.01.20, 12:05</time></span><div class='quote '>И вообще, что тебе мешает сразу написать все команды скриптом?</div></div><br>
Например, то, что следующая команда может быть определена не только результатом предыдущей, но вообще, работой других программ, и заранее неизвестной. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T12:54:34+00:00">31.01.20, 12:54</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819846'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T11:44:30+00:00">31.01.20, 11:44</time></span><div class='quote '>зачем тебе запускать python процессом?</div></div>Пока ничего не знаю об этом, питоновцы живут отдельно.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819848</guid>
        <pubDate>Fri, 31 Jan 2020 12:05:43 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819848</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T11:24:48+00:00">31.01.20, 11:24</time></span><div class='quote '>Прочитал про особенность Питона с предложением, как обойти проблему.</div></div>Ах, воночто. Ок, пиши ему в консольный ввод. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T12:06:58+00:00">31.01.20, 12:06</time></span></span><br>
Нашёл у себя пример:<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;if (CreateProcess(NULL, &amp;commandLine.front(), NULL, NULL, TRUE,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW | BELOW_NORMAL_PRIORITY_CLASS,</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;NULL, NULL, &amp;startInfo, &amp;processInfo) == FALSE)</div><div class="code_line">&nbsp;&nbsp; &nbsp;logMsg(&quot;CreateProcess() failed&quot;, GetLastError());</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{ // при успехе</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(processInfo.hThread); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // HANDLE нитки не нужен</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (WaitForSingleObject(processInfo.hProcess, 1000) == WAIT_TIMEOUT)// пока менеджер работает</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (fs::exists(stop)) continue; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // досрочного стопа нет, продолжаем ждать</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;// Ок, прекращаем прогон</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (!AttachConsole(processInfo.dwProcessId)) &nbsp; &nbsp; &nbsp;// присоединяемся к консоли менеджера</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;logMsg(&quot;AttachConsole() failed&quot;, GetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; &nbsp;written;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;INPUT_RECORD ev[2]; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // создаём два события</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].EventType = ev[1].EventType = KEY_EVENT; &nbsp;// кнопочные</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.bKeyDown = TRUE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // нажали</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.bKeyDown = FALSE; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отпустили</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= ev[1].Event.KeyEvent.wRepeatCount &nbsp; &nbsp;= 1;// ESC 1 раз</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualKeyCode = ev[1].Event.KeyEvent.wVirtualKeyCode = VK_ESCAPE;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.wVirtualScanCode= 0x01; &nbsp; &nbsp;// скан коды ESC</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[1].Event.KeyEvent.wVirtualScanCode= 0x81;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.uChar.AsciiChar = ev[1].Event.KeyEvent.uChar.AsciiChar = 27; // ASCII</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ev[0].Event.KeyEvent.dwControlKeyState=ev[1].Event.KeyEvent.dwControlKeyState=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// пишем в консоль события</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (!WriteConsoleInput(GetStdHandle(STD_INPUT_HANDLE), ev, 2, &amp;written))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;logMsg(&quot;WriteConsoleInput() failed&quot;, GetLastError());</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FreeConsole(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// отсоединяемся от консоли</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Ждём завершения менеджера</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (WaitForSingleObject(processInfo.hProcess, INFINITE) != WAIT_OBJECT_0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;logMsg(&quot;UART manager failure&quot;, GetLastError());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD exitCode = -1;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Получить код завершения менеджера</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetExitCodeProcess(processInfo.hProcess, &amp;exitCode);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(processInfo.hProcess);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return exitCode;</div><div class="code_line">&nbsp;&nbsp;}</div></ol></div></div></div></div>Мне тут надо было только ESC послать, но никто не запрещает писать туда целые строки.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T12:15:31+00:00">31.01.20, 12:15</time></span></span><br>
Неочевидные вещи:<ul class="tag-list"><li>в CreateProcess() важен флаг CREATE_NEW_PROCESS_GROUP, который создаёт новую группу процессов с собственной консолью;</li><li>Id этой консоли совпадает с Id создаваемого процесса;</li><li>если в этой группе окажется несколько процессов, они все разделяют одну консоль;</li><li>можно посылать любые консольные события; не помню точно, но, вроде бы, кроме ctrl-break; но можно ctrl-c;</li><li>не исследовал, но вполне возможно, что прям-таки все поля структуры заполнять не надо; типа скан-кодов; вероятно, зависит от управляемого т.о. процесса.</li></ul> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-01-31T12:17:45+00:00">31.01.20, 12:17</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819845'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T11:24:48+00:00">31.01.20, 11:24</time></span><div class='quote '>Но это помогло только для одной команды.</div></div>И вообще, что тебе мешает сразу написать все команды скриптом?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819846</guid>
        <pubDate>Fri, 31 Jan 2020 11:44:30 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819846</link>
        <description><![CDATA[shm: <strong class='tag-b'>vlad2</strong>, а зачем тебе запускать python процессом? Там же есть готовые библиотеки для интеграции скриптов внутрь твоего exe на плюсах.]]></description>
        <author>shm</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819845</guid>
        <pubDate>Fri, 31 Jan 2020 11:24:48 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819845</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819841'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T10:01:10+00:00">31.01.20, 10:01</time></span><div class='quote '>Не всеми консольными приложениями можно управлять</div></div><br>
Спасибо, <strong class='tag-b'>ЫукпШ</strong>. Прочитал про <a class='tag-url' href='https://fooobar.com/questions/2179789/why-doesnt-python-behave-as-expected-when-stdout-and-stdin-are-redirected' target='_blank'>особенность</a> Питона с предложением, как обойти проблему. Но это помогло только для одной команды. При попытке дать другую (создать ещё один файл), Питон закрывается и всё, вторая команда не выполняется. <br>
Из консоли всё работает нормально. Теперь задача, как выполнить несколько команд в этом открытом Питоне.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819841</guid>
        <pubDate>Fri, 31 Jan 2020 10:01:10 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819841</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819838'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T09:38:16+00:00">31.01.20, 09:38</time></span><div class='quote '>Консольное приложение - это интерпретатор <a class='tag-url' href='https://www.python.org/' target='_blank'>Python</a>. Вот <a class='tag-url' href='https://www.python.org/ftp/python/3.7.6/python-3.7.6-amd64-webinstall.exe' target='_blank'>установщик</a>.</div></div><br>
Не всеми консольными приложениями можно управлять<br>
посредством pipe. Да, у меня такое было.<br>
Внутрь Питона не влезешь...<br>
Что можно попробовать - напиши консольного &quot;кролика&quot;<br>
и по-отлаживай твой комплекс с двух сторон.<br>
Просто чтобы убедиться, что &quot;Мастер&quot; работает правильно.<br>
Передавай &quot;кролику&quot; то же самое, что и Питону и изучай,<br>
как идут данные в обе стороны.<br>
---<br>
Других идей пока нет.<br>
---<br>
Качай ситуацию, придумывай эксперименты.<br>
Как юзер вводит информацию ? нажимает клавишу раз в секунду,<br>
каждый раз дожидаясь эха на экране.<br>
Сделай такой алгоритм - передай данные по-символьно с обязательным<br>
ожиданием эха перед вводом следующего символа.<br>
---<br>
А, вот я нашёл кусочек своего исходника - pipe я инициализировал иначе:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">bool WINAPI MPIPE::Create(DWORD dwSize) </div><div class="code_line">{</div><div class="code_line">&nbsp;if(pipe) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;SECURITY_DESCRIPTOR sd; ::ZeroMemory(&amp;sd,sizeof(sd));//структура security для пайпов</div><div class="code_line">&nbsp;SECURITY_ATTRIBUTES sa; ::ZeroMemory(&amp;sa,sizeof(sa));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;sa.nLength &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= sizeof(sa);</div><div class="code_line">&nbsp;sa.lpSecurityDescriptor = NULL;</div><div class="code_line">&nbsp;sa.bInheritHandle &nbsp; &nbsp; &nbsp; = true; &nbsp; &nbsp; &nbsp; //разрешаем наследование дескрипторов</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(WinIsNT())</div><div class="code_line">&nbsp;{</div><div class="code_line">&nbsp;&nbsp;if(!::InitializeSecurityDescriptor(&amp;sd,SECURITY_DESCRIPTOR_REVISION)) return false;</div><div class="code_line">&nbsp;&nbsp;if(!::SetSecurityDescriptorDacl(&amp;sd, true, NULL, false)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp;sa.lpSecurityDescriptor = &sd;</div><div class="code_line">&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;if(!::CreatePipe(hReadStd,hWriteStd,&amp;sa,dwSize)) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;pipe=true;</div><div class="code_line">&nbsp;return true;</div><div class="code_line">} </div><div class="code_line">//----------------------------------------------------------------------------------</div></ol></div></div></div></div>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819838</guid>
        <pubDate>Fri, 31 Jan 2020 09:38:16 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819838</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T08:44:50+00:00">31.01.20, 08:44</time></span><div class='quote '>И делай вручную все необходимые команды.<br>
Будет ли работать правильным образом ? </div></div><br>
Да, это первое, что проверил: ручками работает, как надо: выполнил команду и ждёт следующей, пока не закрою. Хочу сделать то же самое, но из программы.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T08:44:50+00:00">31.01.20, 08:44</time></span><div class='quote '>Что будет, если ввести &quot;&#092;r&#092;n&quot; ?<br>
я не знаю.</div></div><br>
Любая комбинация &#092;r и &#092;n и её отсутствие никак не влияет (о чём это говорит?).<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819836'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-31T08:44:50+00:00">31.01.20, 08:44</time></span><div class='quote '>Хочется посмотреть исходник принимающей стороны.</div></div><br>
Консольное приложение - это интерпретатор <a class='tag-url' href='https://www.python.org/' target='_blank'>Python</a>. Вот <a class='tag-url' href='https://www.python.org/ftp/python/3.7.6/python-3.7.6-amd64-webinstall.exe' target='_blank'>установщик</a>.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819836</guid>
        <pubDate>Fri, 31 Jan 2020 08:44:50 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819836</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T09:28:55+00:00">30.01.20, 09:28</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819732'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T07:52:38+00:00">30.01.20, 07:52</time></span><div class='quote '>Посылаю команду консольному приложению, запущенного ...</div></div><br>
А каким образом консольное приложение читает команду ?</div></div><br>
Хочется посмотреть исходник принимающей стороны.<br>
Твоего slave-приложения. Консольного, которым ты управляешь.<br>
---<br>
Вызывает сомнения это:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">char buf[] = {&quot;f= open(\&quot;D:\__aa.txt\&quot;,\&quot;w+\&quot;)\r\n&quot;};</div></ol></div></div></div></div><br>
Когда ты пайпом управляешь консольным приложением, ты фактически<br>
подменяешь ручной ввод действиями приложения - Мастера.<br>
Пайп подключает консольный ввод/вывод к другому приложению.<br>
Что будет, если ввести &quot;&#092;r&#092;n&quot; ?<br>
я не знаю.<br>
С клавиатуры мы вводим только &#39;&#092;r&#39;.<br>
---<br>
Запусти управляемое консольное приложение отдельно.<br>
И делай вручную все необходимые команды.<br>
Будет ли работать правильным образом ?<br>
---<br>
А что консольное приложение шлёт назад ?<br>
Когда юзер жмёт на клавиши, он получает эхо на скрин.<br>
Твоё мастер-приложение тоже должно получить весь этот вывод.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819833</guid>
        <pubDate>Fri, 31 Jan 2020 07:22:25 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819833</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819802'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T23:16:21+00:00">30.01.20, 23:16</time></span><div class='quote '>я задал этот вопрос чтобы взглянуть на исходник.</div></div><br>
Вот конкретный работающий код:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;UnicodeString Cons_App = L&quot;Python&quot;;</div><div class="code_line">&nbsp;&nbsp;HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SECURITY_ATTRIBUTES sa;</div><div class="code_line">&nbsp;&nbsp;PROCESS_INFORMATION pi;</div><div class="code_line">&nbsp;&nbsp;STARTUPINFO si;</div><div class="code_line">&nbsp;&nbsp;try</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;SetCurrentDir(CurDir);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;sa, sizeof(SECURITY_ATTRIBUTES));</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.bInheritHandle = TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.lpSecurityDescriptor = NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadOut, &amp;hWriteOut, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &amp;hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadIn, &amp;hWriteIn, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &amp;hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;si, sizeof(STARTUPINFO));</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.cb=sizeof(STARTUPINFO);</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdInput &nbsp; = hReadIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdOutput &nbsp;= hWriteOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &amp;si, &amp;pi);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DWORD count = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buf[] = {&quot;f= open(\&quot;D:\__aa.txt\&quot;,\&quot;w+\&quot;)\r\n&quot;};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, sizeof(buf), &amp;count, NULL); &nbsp; // &nbsp;запись команды</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;Sleep(10000);</div><div class="code_line">&nbsp;</div><div class="code_line">// &nbsp;WriteFile(hWriteInDup, &quot;f.close()\r\n&quot;, 11, &amp;count, NULL); &nbsp; // &nbsp;запись команды</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteInDup); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // команда выполняется только после CloseHandle = закрытия консольного приложения</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hProcess);</div></ol></div></div></div></div><br>
Файл появляется вместе с закрытием интерпретатора, а мне надо, чтобы файл образовался, но Питон остался, чтобы дать другие команды и что-то прочитвть из консоли (про чтение пока не думал, пока отлаживаю запись).]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819803</guid>
        <pubDate>Fri, 31 Jan 2020 03:17:00 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819803</link>
        <description><![CDATA[Qraizer: Закешировалось?]]></description>
        <author>Qraizer</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819802</guid>
        <pubDate>Thu, 30 Jan 2020 23:16:21 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819802</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819762'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T16:00:59+00:00">30.01.20, 16:00</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T09:28:55+00:00">30.01.20, 09:28</time></span><div class='quote '>А каким образом консольное приложение читает команду ?</div></div><br>
Первый раз делаю такое приложение, которое работает с консольным.</div></div><br>
я задал этот вопрос чтобы взглянуть на исходник. :)]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819762</guid>
        <pubDate>Thu, 30 Jan 2020 16:00:59 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819762</link>
        <description><![CDATA[vlad2: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819745'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T09:28:55+00:00">30.01.20, 09:28</time></span><div class='quote '>А каким образом консольное приложение читает команду ?</div></div><br>
Первый раз делаю такое приложение, которое работает с консольным. Думаю, что команда должна выполниться после WriteFile. Однако, не получается - ни с ожиданием, никак. <br>
Выполняется только во время CloseHandle.<br>
Команда - создание файла, который появляется только после CloseHandle.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819745</guid>
        <pubDate>Thu, 30 Jan 2020 09:28:55 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819745</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=416642&view=findpost&p=3819732'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>vlad2 &#064; <time class="tag-quote__quoted-time" datetime="2020-01-30T07:52:38+00:00">30.01.20, 07:52</time></span><div class='quote '>Посылаю команду консольному приложению, запущенного ...</div></div><br>
А каким образом консольное приложение читает команду ?<br>
<br>
&quot;Как выполнять команды и читать из командной строки консольного приложения без закрытия самого приложения?&quot;<br>
Интересен также вопрос, по какой причине ты сделал такой вывод..<br>
Если посмотреть твой исходник:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; </div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;si, sizeof(STARTUPINFO));</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.cb=sizeof(STARTUPINFO);</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdInput &nbsp; = hReadIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdOutput &nbsp;= hWriteOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &amp;si, &amp;pi);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, len, &amp;count, NULL); &nbsp; // &nbsp;запись команды</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteInDup); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // команда выполняется только после CloseHandle = закрытия консольного приложения</div><div class="code_line">...</div></ol></div></div></div></div><br>
то все операции непрерывно следуют одна за другой.<br>
  После WriteFile данные консольным приложением не успевают<br>
  приняться до  CloseHandle(hWriteInDup);<br>
попробуй:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, len, &amp;count, NULL); &nbsp; // &nbsp;запись команды</div><div class="code_line">&nbsp;&nbsp; &nbsp;::Sleep(10000);// 10 секунд</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteInDup); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // команда выполняется только после CloseHandle = закрытия консольного приложения</div></ol></div></div></div></div>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819732</guid>
        <pubDate>Thu, 30 Jan 2020 07:52:38 +0000</pubDate>
        <title>Как программно выполнить команду консольного приложения?</title>
        <link>https://forum.sources.ru/index.php?showtopic=416642&amp;view=findpost&amp;p=3819732</link>
        <description><![CDATA[vlad2: Посылаю команду консольному приложению, запущенного CreateProcess, которая выполняется только после закрытия хэндла = закрытия этого приложения. Вот рабочий пример (один из нашедшихся в сети):<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;HANDLE hReadIn, hWriteIn, hReadOut, hWriteOut, hWriteInDup, hWriteOutDup;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SECURITY_ATTRIBUTES sa;</div><div class="code_line">&nbsp;&nbsp;PROCESS_INFORMATION pi;</div><div class="code_line">&nbsp;&nbsp;STARTUPINFO si;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;sa, sizeof(SECURITY_ATTRIBUTES));</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.nLength = sizeof(SECURITY_ATTRIBUTES);</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.bInheritHandle = TRUE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sa.lpSecurityDescriptor = NULL;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadOut, &amp;hWriteOut, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hReadOut, GetCurrentProcess(), &amp;hWriteOutDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreatePipe(&amp;hReadIn, &amp;hWriteIn, &amp;sa, NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;DuplicateHandle(GetCurrentProcess(), hWriteIn, GetCurrentProcess(), &amp;hWriteInDup, 0, FALSE, DUPLICATE_SAME_ACCESS);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZeroMemory(&amp;si, sizeof(STARTUPINFO));</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.cb=sizeof(STARTUPINFO);</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.dwFlags &nbsp; &nbsp; = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.wShowWindow = SW_HIDE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdInput &nbsp; = hReadIn;</div><div class="code_line">&nbsp;&nbsp; &nbsp;si.hStdOutput &nbsp;= hWriteOut;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CreateProcess(NULL, Cons_App.c_str(), NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &amp;si, &amp;pi);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WriteFile(hWriteInDup, buf, len, &amp;count, NULL); &nbsp; // &nbsp;запись команды</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteInDup); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // команда выполняется только после CloseHandle = закрытия консольного приложения</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hReadOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hWriteIn);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hThread);</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(pi.hProcess);</div></ol></div></div></div></div><br>
Как выполнять команды и читать из командной строки консольного приложения без закрытия самого приложения?<br>
Спасибо.]]></description>
        <author>vlad2</author>
        <category>C/C++: Системное программирование и WinAPI</category>
      </item>
	
      </channel>
      </rss>
	