Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как узнать статус завершения запущенной консольной программы?


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]

Гетпроцессэкзиткоде


Наверх

Титульная страница Поиск, карта сайта Написать письмо