stdin und stdout beim Start eines Konsolenprogramms umbiegen



  • 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:

    HANDLE CreateRWFileHandle (AnsiString name)
    {
        SECURITY_ATTRIBUTES     tmpSec;
        HANDLE                  handle;
    
        memset (&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,
            &tmpSec,
            CREATE_ALWAYS,
            FILE_FLAG_DELETE_ON_CLOSE,
            0
        );
    
        if (handle == INVALID_HANDLE_VALUE)
            ShowLastError();
    }
    
    AnsiString  ExecuteCMDApp()
    {
        AnsiString              bufOut          = "";
        unsigned long           size;
        unsigned long           written;
        STARTUPINFO             startupInfo;
        PROCESS_INFORMATION     processInfo;
    
        GetStartupInfo (&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,
                &startupInfo,
                &processInfo
            );
    
        if (res)
        {
            WaitForSingleObject(processInfo.hProcess, INFINITE);
    
            SetFilePointer (startupInfo.hStdOutput,0,NULL,FILE_BEGIN);
    	--> Error, ungültiges HANDLE
            size = GetFileSize (startupInfo.hStdOutput, NULL);
    	--> Error, ungültiges HANDLE
            char *buf = new char(size);
            ReadFile (startupInfo.hStdOutput, buf, size, &written, NULL);
    
            bufOut = buf;
            delete buf;
            CloseHandle (startupInfo.hStdOutput);
            CloseHandle (startupInfo.hStdInput);
            CloseHandle (startupInfo.hStdError);
    
        }
        return bufOut;
    }
    

    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.

    Sieht jemand von euch gleich den Bock?
    - Adrian



  • klarer Fall - in deiner Funktion fehlt die 'return'-Anweisung 😉 Da wundert es mich sowieso, daß der Compiler das kommentarlos geschluckt hat.

    (PS: Klassen wie 'AnsiString' solltest du besser per const Referenz übergeben - das geht schneller)



  • Naja, was soll ich dazu sagen? Lachen oder Heulen? - SOOOO DOOOOF! Danke für die Hilfe. Hätte selbst wohl noch durchgedreht.

    😃 😡 🙄 😃

    Danke!!
    - Adrian



  • SOOOO DOOOOF!

    FULL ACK 😃 👍


Anmelden zum Antworten