function SHCompleteProcess(const ACommandLine:string; var AExitCode:cardinal;
AWaitInterval:dword=INFINITE):dword;
var
LProcessHandle:THandle;
StartupInfo:TStartupInfo;
ProcessInformation:TProcessInformation;
begin
{Initiate process}
FillChar(StartupInfo,Sizeof(StartupInfo),0);
FillChar(ProcessInformation,Sizeof(ProcessInformation),0);
if not CreateProcess(nil,pchar(ACommandLine),
nil,nil,false,CREATE_DEFAULT_ERROR_MODE+CREATE_NEW_CONSOLE+CREATE_NEW_PROCESS_GROUP,nil,
nil,StartupInfo,ProcessInformation)then begin
Result:=PROCESS_NOT_START;
Exit;
end;
try
{Wait for it to complete then get exit code}
LProcessHandle:=ProcessInformation.hProcess;
Result:=WaitForSingleObject(LProcessHandle,AWaitInterval);
GetExitCodeProcess(LProcessHandle,AExitCode);
finally
CloseHandle(ProcessInformation.hProcess);
CloseHandle(ProcessInformation.hThread);
end;
end;