![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как узнать статус завершения запущенной консольной программы?
Franzy © (2008-06-09 19:09:00)Итак, я из своей программы запускаю другую (консольную) программу (с помощью CreateProcess). Эта консольная прога может завершить работу либо нормально, либо с ошибкой (речь идет не об ошибках типа деления на ноль, а о "своих" ошибках, типа неправильно переданных параметров и т.п.) Как мне лучше всего узнать, как завершилась консольная программа?
В старые добрые времена ДОС, когда программа завершалась с помощью halt(errorcode), это можно было сделать с помощью системной переменной ERRORLEVEL. Как это делается теперь, во времена Windows?
Franzy (2008-06-10 16:32:00) [1]2Palladin
Спасибо! Там и в самом деле просто dword :) Все заработало.
Palladin (2008-06-10 16:01:00) [2]надо смотреть, как функция объявлена в windows.pas, а не то что про нее пишут в Windows SDK
Franzy (2008-06-10 15:59:00) [3]Неполучается. Я, наверно, как-то не так использую указатель. Какой тип не указываю, всегда пишет
[Error] main.pas(773): Types of actual and formal var parameters must be identical.
Покажите пример, как надо делать, пожалуйста.
Anatoly Podgoretsky (2008-06-10 15:20:00) [4]> Franzy (10.06.2008 15:12:06) [6]
^Longword
Германн (2008-06-10 15:18:00) [5]LPDWORD = PDWORD
PDWORW = ^DWORD
См. Windows.pas
Franzy (2008-06-10 15:12:00) [6]Черт, никак не разберусь с типами! Что за LPDWORD такой?! У него какой аналог в Дельфи?
Приведите пример использования, пожалуйста. Вот фрагмент из моей проги:
var si:STARTUPINFO;
pi:PROCESS_INFORMATION;
cmdline: string;
flag : boolean;
//errorcode: lpdword;
begin
SaveProject(curproject);
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:='gridder2D.exe '+curproject;
flag:=true;
if not CreateProcess( nil, // No module name (use command line).
PChar(cmdline), // Command line.
nil, // Process handle not inheritable.
nil, // Thread handle not inheritable.
False, // Set handle inheritance to FALSE.
0, // No creation flags.
nil, // Use parent's environment block.
nil, // Use parent's starting directory.
si, // Pointer to STARTUPINFO structure.
pi ) // Pointer to PROCESS_INFORMATION structure.
then
begin
ShowMessage('Не удалось запустить процесс!');
flag:=false;
end;
if flag then
begin
WaitForSingleObject( pi.hProcess, INFINITE );
GetExitCodeProcess( pi.hProcess, errorcode); //????????
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
ShowMessage(inttostr(errorcode)); //debug
//read data
readdata();
ShowMessage('Готово!');
end;
Anatoly Podgoretsky (2008-06-09 23:58:00) [7]
> В старые добрые времена ДОС, когда программа завершалась
> с помощью halt(errorcode), это можно было сделать с помощью
> системной переменной ERRORLEVEL. Как это делается теперь,
> во времена Windows?
Так и делается, ничего не изменилось.
Franzy (2008-06-09 23:12:00) [8]2Юрий Зотов
Спасибо!
Юрий Зотов (2008-06-09 19:19:00) [9]1. Запускаемая программа должна передавать системе код своего возврата. Если программа Ваша, то это можно сделать тем же Halt. Если нет - смотрите ее документацию. Не факт, что она вообще это делает.
2. После вызова CreateProcess надо дождаться завершения программы (WaitForSingleObject) и получить ее код возврата (GetExitCodeProcess).
Поросенок Винни-Пух (2008-06-09 19:13:00) [10]Точнее гетэкзиткодепроцесс
Поросенок Винни-Пух (2008-06-09 19:12:00) [11]Гетпроцессэкзиткоде