BOOL ProcessCommandLine(char * pcCommandLine, SOCKET s) { STARTUPINFO si; PROCESS_INFORMATION pi; SECURITY_ATTRIBUTES sa; HANDLE hReadPipe, hWritePipe; DWORD dwWaitResult = WAIT_TIMEOUT, dwBytesRead, dwExitCode, dwSizeLow, dwSizeHigh, dwError; char cReadLine[MAX_LINE_LENGTH]; BOOL bDoRead = TRUE, bOK = TRUE; MSG AppMsg; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); //Pipes erzeugen sa.nLength=sizeof(sa); sa.bInheritHandle=TRUE; sa.lpSecurityDescriptor=NULL; bOK = CreatePipe(&hReadPipe, &hWritePipe, &sa, 1048576); if(!bOK) { //FEHLER dwError = GetLastError(); bOK = FALSE; goto PROCESS_END_NOPIPE; } //Pipes eintragen si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.hStdOutput = hWritePipe; //Schreib-Ende der Pipe an Prozess übergeben si.hStdError = hWritePipe; //Schreib-Ende der Pipe an Prozess übergeben si.wShowWindow = SW_SHOWMINNOACTIVE; //Prozess starten bOK = CreateProcess(NULL, pcCommandLine, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi); if(!bOK) { //FEHLER dwError = GetLastError(); goto PROCESS_END_NOPROC; } //Auf Ende warten und Messages lesen while(dwWaitResult != WAIT_OBJECT_0) { dwWaitResult = WaitForSingleObject(pi.hProcess, 10); while(dwSizeLow = GetFileSize(hReadPipe, &dwSizeHigh)) { ZeroMemory(cReadLine, MAX_LINE_LENGTH); //Aus dem Leseende der Pipe die Progzessausgaben lesen if(bDoRead = ReadFile(hReadPipe, cReadLine, MAX_LINE_LENGTH - 1, &dwBytesRead, NULL)) { if(dwBytesRead) { //**** hier Programmausgabe verarbeiten (z.B. send) ******* send(s, cReadLine, 1023, 0); } } else { bOK = FALSE; dwError = GetLastError(); } } //Applikations-Messagequeue verarbeiten if(PeekMessage(&AppMsg, 0, 0, 0, PM_NOREMOVE)) { GetMessage(&AppMsg, 0, 0, 0); TranslateMessage(&AppMsg); DispatchMessage(&AppMsg); } } if(bOK) { bOK = GetExitCodeProcess(pi.hProcess, &dwExitCode); if(bOK) { if(dwExitCode != 0) { //Prozess kehrt mit Ergebnis != 0 zurück bOK = FALSE; } } else { //FEHLER im GetExitCodeProcess dwError = GetLastError(); bOK = FALSE; } } //Close handles CloseHandle(pi.hProcess); CloseHandle(pi.hThread); PROCESS_END_NOPROC: CloseHandle(hWritePipe); CloseHandle(hReadPipe); PROCESS_END_NOPIPE: return bOK; }