Получение потока вывода программы, запущенной из процесса
От: MerlinKory  
Дата: 13.10.04 20:29
Оценка:
Доброе время суток.
Сразу же прошу прощения, если эта тема уже обсуждалась... по поиску я не нашел ответа на форуме.

Итак, задача проста: программа (компилятор Delphi — dcc32.exe) запускается из процесса (созданного посредством функции CreateProcess, как вы понимаете). Компилятору передаются в строке запуска необходимые ключи и имя файла с исходным текстом на Паскале. Для получения информации о том, как прошла компиляция (были ли ошибки или все прошло удачно) в структуре STARTUPINFO флаг dwFlags устанавливается в STARTF_USESTDHANDLES и хеадеры файлов, которые будут использованы в качестве потоков ввода, вывода и ошибок, передаются в соответствующие поля этой же структуры. Приведу кусок исходного кода:

HANDLE hInputStream = CreateFile("compiler_in.txt", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 
                                 FILE_ATTRIBUTE_NORMAL, 0); 

if (hInputStream == INVALID_HANDLE_VALUE) { 
   cout << "Error while creating compiler_in.txt file" << endl; 
   return GetLastError(); 
} 

HANDLE hOutputStream = CreateFile("compiler_out.txt", GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, 
                                  FILE_ATTRIBUTE_NORMAL, 0); 

if (hOutputStream == INVALID_HANDLE_VALUE) { 
   cout << "Error while creating compiler_out.txt file" << endl; 
   return GetLastError(); 
} 

// create process 
PROCESS_INFORMATION pi; 
STARTUPINFO si; 
ZeroMemory(&si, sizeof(si)); 
si.cb = sizeof(si); 
si.dwFlags = STARTF_USESTDHANDLES; 

// setup handles 
si.hStdInput = hInputStream; 
si.hStdOutput = hOutputStream; 
si.hStdError = hOutputStream; 

BOOL b = CreateProcess(0, (char*)compilecmd, 0, 0, false, 0, 0, 0, &si, &pi);


После запуска программы компиляция исходника проходит успешно, необходимые файлы compiler_in.txt и compiler_out.txt создаются, но файл compiler_out.txt остается пуст, несмотря на то, что в нем должна быть информация о процессе компиляции: сколько строк откомпилировано и т.д. При этом, даже если в исходнике Паскаля намеренно допустить ошибку, чтобы компилятор начал ругаться, то это приводит лишь к тому, что exe-файла на выходе мы не получаем, а файл потока вывода/ошибки по-прежнему пуст.

Кто знает, в чем может быть проблема? Что я сделал неправильно?
Gnothi seauton
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.