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;