Все решил, но отписаться было некогда. Короче, вот решение под windows:
Функция создания отдельного процесса с перехватываемым выводом stdout и stderr:
| Код | HANDLE hOutput, hProcess;
HANDLE SpawnAndRedirect(LPCTSTR commandLine, HANDLE stdOutputReadPipe, LPCTSTR currentDirectory) { HANDLE stdOutputWritePipe, stdOutput, stdError; CreatePipe(stdOutputReadPipe, &stdOutputWritePipe, NULL, 0); DuplicateHandle(GetCurrentProcess(), stdOutputWritePipe, GetCurrentProcess(), &stdOutput, 0, TRUE, DUPLICATE_SAME_ACCESS); DuplicateHandle(GetCurrentProcess(), stdOutput, GetCurrentProcess(), &stdError, 0, TRUE, DUPLICATE_SAME_ACCESS); CloseHandle(stdOutputWritePipe); PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); si.hStdOutput = stdOutput; si.hStdError = stdError; si.wShowWindow = SW_HIDE; TCHAR commandLineCopy[1024]; strcpy(commandLineCopy, commandLine); if(!CreateProcess(NULL, commandLineCopy, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, currentDirectory, &si, &pi)) { CloseHandle(stdOutput); CloseHandle(stdError); CloseHandle(stdOutputReadPipe); stdOutputReadPipe = INVALID_HANDLE_VALUE; return NULL; } CloseHandle(pi.hThread); CloseHandle(stdOutput); CloseHandle(stdError); return pi.hProcess; }
|
Запуск консольного приложения:
| Код | ... hProcess = (HANDLE)SpawnAndRedirect("console_app.exe", &hOutput, NULL); if(!hProcess) return; ...
|
Функция перехвата:
| Код | void *thread_function(void *threadid) { char buffer[1024]; DWORD read; while(ReadFile(hOutput, buffer, 1024, &read, NULL)) { gtk_text_buffer_insert_at_cursor(text_buffer1, buffer, read); } CloseHandle(hOutput); CloseHandle(hProcess); }
|
Запуск функции перехвата в отдельном потоке:
| Код | ... rc = pthread_create(&mthread, NULL, thread_function, NULL); ...
|
|