Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
ВнизКак узнать статус завершения запущенной консольной программы? Найти похожие ветки
← →
Franzy (2008-06-09 19:09) [0]Итак, я из своей программы запускаю другую (консольную) программу (с помощью CreateProcess). Эта консольная прога может завершить работу либо нормально, либо с ошибкой (речь идет не об ошибках типа деления на ноль, а о "своих" ошибках, типа неправильно переданных параметров и т.п.) Как мне лучше всего узнать, как завершилась консольная программа?
В старые добрые времена ДОС, когда программа завершалась с помощью halt(errorcode), это можно было сделать с помощью системной переменной ERRORLEVEL. Как это делается теперь, во времена Windows?
← →
Поросенок Винни-Пух © (2008-06-09 19:12) [1]Гетпроцессэкзиткоде
← →
Поросенок Винни-Пух © (2008-06-09 19:13) [2]Точнее гетэкзиткодепроцесс
← →
Юрий Зотов © (2008-06-09 19:19) [3]1. Запускаемая программа должна передавать системе код своего возврата. Если программа Ваша, то это можно сделать тем же Halt. Если нет - смотрите ее документацию. Не факт, что она вообще это делает.
2. После вызова CreateProcess надо дождаться завершения программы (WaitForSingleObject) и получить ее код возврата (GetExitCodeProcess).
← →
Franzy (2008-06-09 23:12) [4]2Юрий Зотов
Спасибо!
← →
Anatoly Podgoretsky © (2008-06-09 23:58) [5]
> В старые добрые времена ДОС, когда программа завершалась
> с помощью halt(errorcode), это можно было сделать с помощью
> системной переменной ERRORLEVEL. Как это делается теперь,
> во времена Windows?
Так и делается, ничего не изменилось.
← →
Franzy (2008-06-10 15:12) [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;
← →
Германн © (2008-06-10 15:18) [7]LPDWORD = PDWORD
PDWORW = ^DWORD
См. Windows.pas
← →
Anatoly Podgoretsky © (2008-06-10 15:20) [8]> Franzy (10.06.2008 15:12:06) [6]
^Longword
← →
Franzy (2008-06-10 15:59) [9]Неполучается. Я, наверно, как-то не так использую указатель. Какой тип не указываю, всегда пишет
[Error] main.pas(773): Types of actual and formal var parameters must be identical.
Покажите пример, как надо делать, пожалуйста.
← →
Palladin © (2008-06-10 16:01) [10]надо смотреть, как функция объявлена в windows.pas, а не то что про нее пишут в Windows SDK
← →
Franzy (2008-06-10 16:32) [11]2Palladin
Спасибо! Там и в самом деле просто dword :) Все заработало.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c