Запустить внешнюю программу и дождаться завершения

Пример кода:

...
var
  SI: TStartupInfo;
  PI: TProcessInformation;
begin
  // Заполняем StartupInfo
  with SI do
  begin
    cb := SizeOf(TStartupInfo);
    dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
    wShowWindow := SW_SHOWNORMAL;  
  end;
  // Выполняем запуск
  if CreateProcess(nil, PChar('Имя файла с путём'), nil, nil, False, 0, nil, nil, SI, PI) then
  begin // Если запуск удался
    // ожидаем завершения, каждые 100 мс давая продышаться основному потоку.
    repeat
       application.ProcessMessages;
    until WaitForSingleObject(PI.hProcess, 100) <> WAIT_TIMEOUT;
    // Закрываем свои дескрипторы
    CloseHandle(PI.hThread);
    CloseHandle(PI.hProcess);
  end
    else
  begin
    // Делаем, что должны, если запуск не удался.
  end;
  ...