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
