Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Запустить приложение и подождать

01.01.2007
Function ExecuteFile(FileName, Params, WorkingDir:string; Wait:boolean):integer;

var
  buffer
: array[0..511] of Char;
 
TmpStr: String;
  i
: Integer;
 
StartupInfo:TStartupInfo;
 
ProcessInfo:TProcessInformation;
  ext
, key, fname, path:string;
  exitcode
:cardinal;
begin
 
if WorkingDir<>'' then ChDir(WorkingDir);
  ext
:=lowercase(ExtractFileExt(FileName));
  path
:=ExtractFilePath(FileName);
 
if ext<>'.exe' then
   
With TRegistry.create do
     
try
       
RootKey:=HKEY_CLASSES_ROOT;
       
OpenKey(ext, false);
       
Key:=ReadString('');
       
CloseKey;
       
OpenKey(key+'\Shell\open\command', false);
        key
:=ReadString('');
        fname
:=ExtractFileName(key);
       
if pos('/', fname)>0 then fname:=copy(fname,1, pos('/',fname)-1);
       
FName:=StringReplace(FName, '%1', '', [rfReplaceAll, rfIgnoreCase]);
       
if pos(' ',FileName)>0 then FileName:='"'+Filename+'"';
       
TmpStr:=ExtractFilePath(key)+Fname+' '+FileName;
       
if Params<>'' then TmpStr := TmpStr + ' ' + Params;
       
Closekey;
     
finally
        free
;
     
end
 
else
   
begin
     
TmpStr := FileName;
     
TmpStr := TmpStr + ' ' + Params;
   
end;
 
StrPCopy(buffer,TmpStr);
 
FillChar(StartupInfo,Sizeof(StartupInfo),#0);
 
StartupInfo.cb := Sizeof(StartupInfo);
 
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 
StartupInfo.wShowWindow := SW_SHOWNORMAL;
 
if CreateProcess(nil, buffer, nil, nil, false, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo) then
   
begin
     
if Wait then
       
begin
         
while WaitforSingleObject(ProcessInfo.hProcess,200)=WAIT_TIMEOUT         do application.ProcessMessages;
         
GetExitCodeProcess(ProcessInfo.hProcess, exitcode);
       
end;
   
end
 
else
   
Result := GetLastError();
end;

Автор: Vit