Код возврата

25.07.2010
4
0
#1
Что требуется:

Необходимо запустить процесс, дождаться его завершения, и определить - если приложение было завершено с ошибкой, то выдавать, например, одно сообщение, если завершено правильно - другое...
Например, запускается инсталлятор: при выходе без установки надо показать соответствующее сообщение. Если установка была совершена - ничего не показываем. На деле приложение может быть любым, не только инсталлятором.
 

sinkopa

Well-known member
17.06.2009
344
4
#3
Что требуется:

Необходимо запустить процесс, дождаться его завершения, и определить - если приложение было завершено с ошибкой, то выдавать, например, одно сообщение, если завершено правильно - другое...
Например, запускается инсталлятор: при выходе без установки надо показать соответствующее сообщение. Если установка была совершена - ничего не показываем. На деле приложение может быть любым, не только инсталлятором.
Ну... если прямо таки любым... :)

Код:
function ExecuteAndWait(FileName: string; HideApplication: Boolean; out ProcessExitCode: Cardinal): Boolean;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
with StartupInfo do
begin
cb := SizeOf(StartupInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := SW_SHOW;
end;
if not CreateProcess(nil, PChar(FileName), nil, nil, False,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then
Result := False
else
begin
if HideApplication then
begin
Application.Minimize;
ShowWindow(Application.Handle, SW_HIDE);
WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
end
else
begin
while (WaitforSingleObject(ProcessInfo.hProcess, 100) = WAIT_TIMEOUT) do
begin
Application.ProcessMessages;
if Application.Terminated then
TerminateProcess(ProcessInfo.hProcess, 0);
end;
end;
GetExitCodeProcess(ProcessInfo.hProcess, ProcessExitCode);

Result := (ProcessExitCode = 0);

if HideApplication then
begin
ShowWindow(Application.Handle, SW_SHOW);
Application.Restore;
Application.BringToFront;
end;
end;
end;
Пример использования:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
ProcessExitCode: Cardinal;
HideMe: Boolean;
begin
s := 'C:\WINDOWS\system32\calc.exe';	// Процесс который надо запустить
HideMe := True;						 // надо ли спрятать (нашу!) форму пока выполняется процесс
if not ExecuteAndWait(s,HideMe, ProcessExitCode) then
ShowMessage('чет не запускается!')
else
ShowMessage('Процесс запустился нормально. Завершился с кодом: '+ IntToStr(ProcessExitCode));

end;
ProcessExitCode = 0 (ноль) - это значит процесс нормально (штатно) отработал и завершился.
Любое значение больше нуля - это собственно тот самый код ошибки на которой "упал" процесс.