Контроль завершения приложения

Решение

function WinExecAndWait32(FileName: String; Visibility: integer): DWORD;
var
  zAppName: array[0..512] of char;
  zCurDir: array[0..255] of char;
  WorkDir: String;
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  Pd: pointer;
begin
  StrPCopy(zAppName, FileName);
  GetDir(0, WorkDir);
  StrPCopy(zCurDir, WorkDir);
  FillChar(StartupInfo, Sizeof(StartupInfo), #0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if not CreateProcess(nil, zAppName, nil, nil, false, CREATE_NEW_CONSOLE
    or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then Result := 0
  else begin
    WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, Result);
  end;
end;
В качестве дополнения внесем резонное исправление – вместо:WaitforSingleObject(ProcessInfo.hProcess, INFINITE); лучше написать:

while WaitforSingleObject(ProcessInfo.hProcess, 200) = WAIT_TIMEOUT do
  TForm1.Repaint;
Смысл замены: в первом варианте главное окно ждёт завершения вызванного сообщения, не обрабатывая при этом никаких событий. Вследствие этого, главное окно не перерисовывается, что выглядит далеко не лучшим образом. Последний вариант исправляет этот недостаток.

[Trubachev Pavel]