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

Подождать завершения DOS-задачи

01.01.2007
Каким образом организовать ожидание завершения DOS-задачи? Например, надо подождать, пока заархивируется файл, и далее обработать его.

uses Windows;
 
procedure
RunRarAndWait;
var
  si
: TStartupInfo;
  pi
: TProcessInformation;
begin
 
//подготовливаем записи si и pi к использованию
 
FillChar(si, SizeOf(si));
  si
.cb := SizeOf(si);
 
FillChar(pi, SizeOf(pi));
 
//попытаемся запустить рар
 
if CreateProcess('rar.exe', 'parameters',
 
nil, nil, //безопасность по умолчанию
 
false,    //не наследовать хэндлов
 
0,        //флаги создания по умолчанию
 
nil,      //переменные среды по умолчанию
 
nil,      //текущая директория по умолчанию
  si
,       //стартовая информация
  pi
)       //а в эту запись получим информацию о созданом процессе
 
then
 
begin
   
//удалось запустить рар
   
//подождем пока рар работает
   
WaitForSingleObject(pi.hProcess, INFINITE);
   
//убираем мусор
   
CloseHandle(pi.hProcess);
   
CloseHandle(pi.hThread);
 
end
 
else
   
//выдаем сообщение об ощибке
   
MessageDlg(SysErrorMessage(GetLastError), mtError, [mbOK], 0);
end;

https://delphiworld.narod.ru/

DelphiWorld 6.0


function WinExecute(CmdLine: string; Wait: Boolean): Boolean;
var
 
StartupInfo: TStartupInfo;
 
ProcessInformation: TProcessInformation;
begin
 
Result := True;
 
try
   
FillChar(StartupInfo, SizeOf(StartupInfo), 0);
   
StartupInfo.cb := SizeOf(StartupInfo);
   
if not CreateProcess(nil, PChar(CmdLine), nil, nil, True, 0, nil,
   
nil, StartupInfo, ProcessInformation) then
      RaiseLastWin32Error
;
   
if Wait then
     
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);
 
except
   
Result := False;
 
end;
end;

https://delphiworld.narod.ru/

DelphiWorld 6.0


function TForm1.StartWithShell(Prog, par, Verz: string;
var hProcess: THandle): DWord;
var
  exInfo
: TShellExecuteInfo;
begin
  hProcess
:= 0;
 
FillChar(exInfo, Sizeof(exInfo), 0);
 
with exInfo do
 
begin
    cbSize
:= Sizeof(exInfo);
    fMask
:= SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
   
Wnd := 0;
    lpVerb
:= 'open';
    lpParameters
:= PChar(par);
    lpFile
:= Pchar(prog);
    nShow
:= SW_HIDE;
 
end;
 
Result := ERROR_SUCCESS;
 
if ShellExecuteEx(@exInfo) then
    hProcess
:= exinfo.hProcess
 
else
   
Result := GetLastError;
end;
 
function TForm1.StartProgramm : Boolean;
var
  r
, ExitCode: DWord;
  err
: string;
  hProcess
: THandle;
begin
 
Result := False;
  r
:= StartWithShell('rar.exe', , 'c:\windows\system',
  hProcess
);
 
if r = ERROR_SUCCESS then
 
begin
    repeat
     
Application.ProcessMessages;
     
GetExitCodeProcess(hProcess, ExitCode);
   
until
     
ExitCode <> STILL_ACTIVE;
    result
:= true;
 
end
 
else
 
begin
   
case r of
      ERROR_FILE_NOT_FOUND
: err:='The specified file was not found.';
      ERROR_PATH_NOT_FOUND
: err:='The specified path was not found.';
      ERROR_DDE_FAIL
: err:='The DDE transaction failed.';
      ERROR_NO_ASSOCIATION
: err:='There is no application associated ' +
     
'with the given filename extension.';
      ERROR_ACCESS_DENIED
: err:='Access denied';
      ERROR_DLL_NOT_FOUND
: err:='DLL not found';
      ERROR_CANCELLED
: err:='The function prompted the user for the ' +
     
'location of the application, but the user cancelled the request.';
      ERROR_NOT_ENOUGH_MEMORY
: err:='Not enough memory';
      ERROR_SHARING_VIOLATION
: err:='A sharing violation occurred.';
     
else
        err
:= 'Unknown';
   
end;
   
MessageDlg('Error: ' + err, mtError, [mbOk], 0);
 
end;
end;

https://delphiworld.narod.ru/

DelphiWorld 6.0