Hoje precisei de uma função que executasse um aplicativo externo e aguardasse sua execução antes de continuar. Testei várias funções que encontrei, mas a única que funcionou foi essa, que aparente é de autoria de Marc Hoffman e fiz alguns ajustes:

<code>function ExecuteAndWait(App, Params: string): Cardinal;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;
  s: array[0..MAX_PATH] of char;
begin
  GetStartupInfo(Startupinfo);

  ExpandEnvironmentStrings(pChar(App), @s, MAX_PATH);
  App := string(pChar(@s));

  if CreateProcess(pChar(App),
    pChar(App + ' ' + Params),
    nil, nil, false, 0, nil,
    pChar(GetCurrentDir),
    StartupInfo,
    ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess, result);
    CloseHandle(ProcessInfo.hProcess);
  end
  else
    raise Exception.CreateFmt('Não foi possível criar o 
      processo %s %s: %d', [App, Params, GetLastError]);
end;
</code>