ExecuteAndWait

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 aparentemente é de autoria de Marc Hoffman, e que depois de pequenos ajustes meus ficou assim:

Listagem 1. Função ExecuteAndWait no Delphi


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;