<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Programm starten und Ausgabe capturen]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich suche eine Möglichkeit aus meinem Code ein anderes Program zu starten und dessen ausgabe (stdout) in einen Stream/String umuleiten.</p>
<p>Falls es in C++ sowas nicht gibt, wär auch eine betriebsystemspezifische Lösung (windows - VS2005) willkommen.</p>
<p>Hab schon versucht sowas zu finden, bin mir aber nicht sicher wie man sowas nennt.</p>
<p>Vielen Dank im Voraus!<br />
Vlad.</p>
<p>Edit:<br />
ich möchte die gesamte ausgabe. Das Programm kann also ruhig blockieren, solange das andere läuft.<br />
(ist nur ein winziges Kommandozeilen-tool)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244837/programm-starten-und-ausgabe-capturen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 19 Sep 2026 03:06:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244837.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 06 Jul 2009 15:14:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Mon, 06 Jul 2009 15:20:13 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Ich suche eine Möglichkeit aus meinem Code ein anderes Program zu starten und dessen ausgabe (stdout) in einen Stream/String umuleiten.</p>
<p>Falls es in C++ sowas nicht gibt, wär auch eine betriebsystemspezifische Lösung (windows - VS2005) willkommen.</p>
<p>Hab schon versucht sowas zu finden, bin mir aber nicht sicher wie man sowas nennt.</p>
<p>Vielen Dank im Voraus!<br />
Vlad.</p>
<p>Edit:<br />
ich möchte die gesamte ausgabe. Das Programm kann also ruhig blockieren, solange das andere läuft.<br />
(ist nur ein winziges Kommandozeilen-tool)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1737989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1737989</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Mon, 06 Jul 2009 15:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Mon, 06 Jul 2009 15:28:39 GMT]]></title><description><![CDATA[<p>&quot;Capture console output&quot; wäre ein gutes Stichwort. Plattformunabhängig geht das vermutlich nicht, und insbesondere unter Windows ist es nicht trivial; alle Details dazu kannst du <a href="http://homepages.tesco.net/J.deBoynePollard/FGA/capture-console-win32.html" rel="nofollow">hier</a> nachlesen. Kurz zusammengefaßt: für Programme mit trivialer Konsolenausgabe ist das mit Pipes machbar, für alles andere (also Programme, die den Konsolenpuffer verändern) suche dir besser eine andere Lösung.</p>
<p>Kürzlich hatte ich so etwas auch einmal benötigt und mir eine entsprechende Funktion selbst geschrieben - zwar in Delphi, aber da ich fast nur Windows-Funktionen verwende, sollte es sich leicht übertragen lassen. Wenns dir hilft, kann ich sie mal posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738006</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 06 Jul 2009 15:28:39 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Mon, 06 Jul 2009 16:05:07 GMT]]></title><description><![CDATA[<p>Danke,<br />
hab jetzt was mit popen gefunden.<br />
Das ist gar nicht so kompliziert.<br />
Was mich nur tierisch nervt, ist dass immer kurz ein Kommandozeilenfenster aufpoppt.</p>
<p>werd mir mal deine lösung anschauen, vielleicht lässt sich das damit verhindern.</p>
<pre><code class="language-cpp">si = _popen( ( string(&quot;si sandboxinfo -S &quot;)+i_sandbox).c_str(), &quot;r&quot;);
  if( si == NULL )
    throw string(&quot;Kann si.exe nicht starten!\n&quot;);

  string ret;
  while( !feof( si ) )
  {
    if( fgets( psBuffer, sizeof(psBuffer), si ) != NULL )
    {
      string temp(psBuffer);
    }
  }
  _pclose( si );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738030</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Mon, 06 Jul 2009 16:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Mon, 06 Jul 2009 17:05:19 GMT]]></title><description><![CDATA[<p>Würde mich nicht wundern, wenn deine Variante für Vollast sorgte. Das könnte man mit WaitForSingleObject() oder, wenn man ganz brutal ist, mit Sleep() vermeiden; keine Ahnung, ob es dafür ein POSIX-Äquivalent gibt.</p>
<p>Um das Öffnen des Konsolenfensters zu unterbinden, müßtest du vermutlich direkt CreateProcess benutzen. Meine Variante macht es so:</p>
<pre><code>function PipeToString (hNamedPipe: THandle; PipeCodePage: ShortInt = CP_ACP): RawByteString;
var
  BytesAvailable, BytesRead: Cardinal;
begin
  Win32Check (PeekNamedPipe (hNamedPipe, nil, 0,
    nil, @BytesAvailable, nil));
  SetLength (Result, BytesAvailable);
  Win32Check (ReadFile (hNamedPipe, PAnsiChar (Result)^, BytesAvailable, BytesRead, nil));
  SetCodePage (Result, PipeCodePage, False);
end;

function CaptureConsoleOutput (Executable, Parameters: String;
  OutputCodePage: ShortInt = CP_OEMCP): RawByteString;
var
  StartupInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  SecAttr: TSecurityAttributes;
  hReadOutputPipe: THandle;

  procedure InitVars;
  begin
    ZeroMemory (@SecAttr, SizeOf (SecAttr));
    ZeroMemory (@StartupInfo, SizeOf (StartupInfo));
    ZeroMemory (@ProcInfo, SizeOf (ProcInfo));
    hReadOutputPipe := 0;

    SecAttr.nLength := SizeOf (SecAttr);
    SecAttr.lpSecurityDescriptor := nil;
    SecAttr.bInheritHandle := True;
    StartupInfo.cb := SizeOf (StartupInfo);
    StartupInfo.dwFlags := STARTF_USESTDHANDLES;
  end;

  procedure SetUpPipes;
  begin
    Win32Check (CreatePipe (hReadOutputPipe, StartupInfo.hStdOutput, @SecAttr, 0));
    StartupInfo.hStdError := StartupInfo.hStdOutput;
  end;

  procedure FreeResources;
  begin
    CloseHandlesIfValid ([hReadOutputPipe, StartupInfo.hStdOutput,
      ProcInfo.hProcess, ProcInfo.hThread]);
  end;

  procedure FlushPipe;
  begin
    Result := Result + PipeToString (hReadOutputPipe, OutputCodePage);
  end;

begin
  InitVars;
  try
    SetUpPipes;
    Win32Check (CreateProcess (nil, PChar (Format ('&quot;%s&quot; %s', [Executable, Parameters])),
      @SecAttr, @SecAttr, TRUE, CREATE_NO_WINDOW, nil, nil, StartupInfo, ProcInfo));

      // The pipe's buffer size is limited; the process will block if we don't fetch
      // the data from time to time.
    while WaitForSingleObject (ProcInfo.hProcess, 100) = WAIT_TIMEOUT do
      FlushPipe;
    FlushPipe;
  finally
    FreeResources;
  end;
end;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738080</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Mon, 06 Jul 2009 17:05:19 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Tue, 07 Jul 2009 05:06:16 GMT]]></title><description><![CDATA[<p>ui, das ist aber umständlich.</p>
<p>mal schauen. Wenns dafür kein consolenfester gibt.<br />
Hab leider noch keine Zeit gehabt das zu testen.</p>
<blockquote>
<p>Würde mich nicht wundern, wenn deine Variante für Vollast sorgte</p>
</blockquote>
<p>das programm läuft nicht mal ne sekunde. Das wird gestartet und gibt soforrt ein paar zeilen aus und beendet sich sofort wieder, von daher gibts da keine große Auslastung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738292</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 07 Jul 2009 05:06:16 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Tue, 07 Jul 2009 09:13:54 GMT]]></title><description><![CDATA[<p>funktioniert bestens, Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738384</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738384</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 07 Jul 2009 09:13:54 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Tue, 07 Jul 2009 13:30:24 GMT]]></title><description><![CDATA[<p>vlad_tepesch schrieb:</p>
<blockquote>
<p>ui, das ist aber umständlich.</p>
</blockquote>
<p>Umfangreicher Vor- und Nachbereitungsbedarf ist bekanntermaßen eine inhärente Eigenschaft der meisten Windows-Funktionen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738587</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 07 Jul 2009 13:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to Programm starten und Ausgabe capturen on Tue, 07 Jul 2009 17:20:55 GMT]]></title><description><![CDATA[<p>da hast du recht!<br />
jedes mal, das struktur anlegen, komplett nullenn und dann in mindestens ein member die größe reinschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738727</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 07 Jul 2009 17:20:55 GMT</pubDate></item></channel></rss>