Доброе время суток.
Сразу же прошу прощения, если эта тема уже обсуждалась... по поиску я не нашел ответа на форуме.
Итак, задача проста: программа (компилятор 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-файла на выходе мы не получаем, а файл потока вывода/ошибки по-прежнему пуст.
Кто знает, в чем может быть проблема? Что я сделал неправильно?