Re: Получение потока вывода программы, запущенной из процесс
От: Leonid Troyanovsky  
Дата: 14.10.04 05:18
Оценка: 3 (1)
Здравствуйте, MerlinKory, Вы писали:

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


А с чего бы это false? Хендлы д.б. наследуемы.
--
С уважением, LVT
Re: Получение потока вывода программы, запущенной из процесс
От: Kochuev  
Дата: 13.10.04 21:04
Оценка: -1
Здравствуйте, MerlinKory, Вы писали:


MK>Кто знает, в чем может быть проблема? Что я сделал неправильно?


Вообще-то установка хэндлов перед вызовом CreateProcess бессмысленна.

В МСДН тот, параметр, который пытаешься передать в функцию обозначен, как [out]:

[msdn]lpProcessInformation
[out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. [/msdn]

Так что привязывать хэндлы к файлам не надо. Чтобы получить данные из этих хэндлов потоков нужно просто вызвать ReadFile(Ex), передав хэндл в качестве параметра.
Получение потока вывода программы, запущенной из процесса
От: 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
Re[2]: Получение потока вывода программы, запущенной из проц
От: MerlinKory  
Дата: 13.10.04 22:28
Оценка:
Здравствуйте, Kochuev, Вы писали:

K>Вообще-то установка хэндлов перед вызовом CreateProcess бессмысленна.


K>В МСДН тот, параметр, который пытаешься передать в функцию обозначен, как [out]:


K>[msdn]lpProcessInformation

K>[out] Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. [/msdn]

K>Так что привязывать хэндлы к файлам не надо. Чтобы получить данные из этих хэндлов потоков нужно просто вызвать ReadFile(Ex), передав хэндл в качестве параметра.


Да, но в том-то и дело, что я привязываю хендлы не к структуре pi, которая действительно возвращается функцией CreateProcess, а к структуре si (STARTUP_INFO), которая передается, как [in]. По идее, данные файлы можно использовать как потоки ввода/вывода/ошибки в процессах, которые запущены подобным образом. Но на практике что-то не срабатывает...
Gnothi seauton
Re[2]: Получение потока вывода программы, запущенной из проц
От: MerlinKory  
Дата: 14.10.04 17:36
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT> А с чего бы это false? Хендлы д.б. наследуемы.


Огромное спасибо! Это и есть решение проблемы.
Gnothi seauton
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.