<?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[stdin und stdout beim Start eines Konsolenprogramms umbiegen]]></title><description><![CDATA[<p>Ich möchte mit CreateProcess ein Konsolen Programm starten und dabei stdin und stdout in eine Pipe / File umbiegen zum anschliessenden Auslesen. Leider klapts nicht, die Handles seien immer ungültig. Erstmals mein Code:</p>
<pre><code class="language-cpp">HANDLE CreateRWFileHandle (AnsiString name)
{
    SECURITY_ATTRIBUTES     tmpSec;
    HANDLE                  handle;

    memset (&amp;tmpSec, 0, sizeof(tmpSec));
    tmpSec.nLength = sizeof(tmpSec);
    tmpSec.bInheritHandle = true;

    handle = CreateFile(
        name.c_str(),
        GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        &amp;tmpSec,
        CREATE_ALWAYS,
        FILE_FLAG_DELETE_ON_CLOSE,
        0
    );

    if (handle == INVALID_HANDLE_VALUE)
        ShowLastError();
}

AnsiString  ExecuteCMDApp()
{
    AnsiString              bufOut          = &quot;&quot;;
    unsigned long           size;
    unsigned long           written;
    STARTUPINFO             startupInfo;
    PROCESS_INFORMATION     processInfo;

    GetStartupInfo (&amp;startupInfo);
    startupInfo.hStdOutput  = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.hStdInput   = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.hStdError   = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.dwFlags     = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    startupInfo.wShowWindow = SW_HIDE;

    bool res = CreateProcess (
            NULL,
            cmdline,	// Kommandozeile des Konsolenprogramms
            NULL,
            NULL,
            true,
            NORMAL_PRIORITY_CLASS,
            NULL,
            NULL,
            &amp;startupInfo,
            &amp;processInfo
        );

    if (res)
    {
        WaitForSingleObject(processInfo.hProcess, INFINITE);

        SetFilePointer (startupInfo.hStdOutput,0,NULL,FILE_BEGIN);
	--&gt; Error, ungültiges HANDLE
        size = GetFileSize (startupInfo.hStdOutput, NULL);
	--&gt; Error, ungültiges HANDLE
        char *buf = new char(size);
        ReadFile (startupInfo.hStdOutput, buf, size, &amp;written, NULL);

        bufOut = buf;
        delete buf;
        CloseHandle (startupInfo.hStdOutput);
        CloseHandle (startupInfo.hStdInput);
        CloseHandle (startupInfo.hStdError);

    }
    return bufOut;
}
</code></pre>
<p>Eigentlich isst es doch überhaupt nicht schwierig, aber was zum Geier ist denn falsch? - Die Dateien (HANDLES) werden übrigens angelegt, ich kann sie ja im Explorer sehen; auch offen sind sie, denn löschen kann ich sie nicht. Werden automatisch beim Beenden gelöscht.</p>
<p>Sieht jemand von euch gleich den Bock?<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/128859/stdin-und-stdout-beim-start-eines-konsolenprogramms-umbiegen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 16:04:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/128859.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 07 Dec 2005 19:55:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to stdin und stdout beim Start eines Konsolenprogramms umbiegen on Wed, 07 Dec 2005 19:56:38 GMT]]></title><description><![CDATA[<p>Ich möchte mit CreateProcess ein Konsolen Programm starten und dabei stdin und stdout in eine Pipe / File umbiegen zum anschliessenden Auslesen. Leider klapts nicht, die Handles seien immer ungültig. Erstmals mein Code:</p>
<pre><code class="language-cpp">HANDLE CreateRWFileHandle (AnsiString name)
{
    SECURITY_ATTRIBUTES     tmpSec;
    HANDLE                  handle;

    memset (&amp;tmpSec, 0, sizeof(tmpSec));
    tmpSec.nLength = sizeof(tmpSec);
    tmpSec.bInheritHandle = true;

    handle = CreateFile(
        name.c_str(),
        GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        &amp;tmpSec,
        CREATE_ALWAYS,
        FILE_FLAG_DELETE_ON_CLOSE,
        0
    );

    if (handle == INVALID_HANDLE_VALUE)
        ShowLastError();
}

AnsiString  ExecuteCMDApp()
{
    AnsiString              bufOut          = &quot;&quot;;
    unsigned long           size;
    unsigned long           written;
    STARTUPINFO             startupInfo;
    PROCESS_INFORMATION     processInfo;

    GetStartupInfo (&amp;startupInfo);
    startupInfo.hStdOutput  = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.hStdInput   = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.hStdError   = CreateRWFileHandle (GetUniqueFileName());
    startupInfo.dwFlags     = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    startupInfo.wShowWindow = SW_HIDE;

    bool res = CreateProcess (
            NULL,
            cmdline,	// Kommandozeile des Konsolenprogramms
            NULL,
            NULL,
            true,
            NORMAL_PRIORITY_CLASS,
            NULL,
            NULL,
            &amp;startupInfo,
            &amp;processInfo
        );

    if (res)
    {
        WaitForSingleObject(processInfo.hProcess, INFINITE);

        SetFilePointer (startupInfo.hStdOutput,0,NULL,FILE_BEGIN);
	--&gt; Error, ungültiges HANDLE
        size = GetFileSize (startupInfo.hStdOutput, NULL);
	--&gt; Error, ungültiges HANDLE
        char *buf = new char(size);
        ReadFile (startupInfo.hStdOutput, buf, size, &amp;written, NULL);

        bufOut = buf;
        delete buf;
        CloseHandle (startupInfo.hStdOutput);
        CloseHandle (startupInfo.hStdInput);
        CloseHandle (startupInfo.hStdError);

    }
    return bufOut;
}
</code></pre>
<p>Eigentlich isst es doch überhaupt nicht schwierig, aber was zum Geier ist denn falsch? - Die Dateien (HANDLES) werden übrigens angelegt, ich kann sie ja im Explorer sehen; auch offen sind sie, denn löschen kann ich sie nicht. Werden automatisch beim Beenden gelöscht.</p>
<p>Sieht jemand von euch gleich den Bock?<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/936822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/936822</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Wed, 07 Dec 2005 19:56:38 GMT</pubDate></item><item><title><![CDATA[Reply to stdin und stdout beim Start eines Konsolenprogramms umbiegen on Thu, 08 Dec 2005 07:33:00 GMT]]></title><description><![CDATA[<p>klarer Fall - in deiner Funktion fehlt die 'return'-Anweisung <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="😉"
    /> Da wundert es mich sowieso, daß der Compiler das kommentarlos geschluckt hat.</p>
<p>(PS: Klassen wie 'AnsiString' solltest du besser per const Referenz übergeben - das geht schneller)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937013</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 08 Dec 2005 07:33:00 GMT</pubDate></item><item><title><![CDATA[Reply to stdin und stdout beim Start eines Konsolenprogramms umbiegen on Thu, 08 Dec 2005 07:51:09 GMT]]></title><description><![CDATA[<p>Naja, was soll ich dazu sagen? Lachen oder Heulen? - SOOOO DOOOOF! Danke für die Hilfe. Hätte selbst wohl noch durchgedreht.</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Danke!!<br />
- Adrian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/937029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937029</guid><dc:creator><![CDATA[ABader]]></dc:creator><pubDate>Thu, 08 Dec 2005 07:51:09 GMT</pubDate></item><item><title><![CDATA[Reply to stdin und stdout beim Start eines Konsolenprogramms umbiegen on Thu, 08 Dec 2005 07:54:46 GMT]]></title><description><![CDATA[<blockquote>
<p>SOOOO DOOOOF!</p>
</blockquote>
<p>FULL ACK <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/937032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/937032</guid><dc:creator><![CDATA[100%]]></dc:creator><pubDate>Thu, 08 Dec 2005 07:54:46 GMT</pubDate></item></channel></rss>