Запуск приложения и ожидание его завершения. Возможно указать максимальное время ожидания, после окончания которого функция продолжит работу не дожидаясь завершения запущенного приложения. Скрытый запуск приложений без появления окон, как консольных, так и оконных.
1 2 3 4 5 6 7 8 9 10 11 12 |
var path_params, workDir: WideString; sec: Integer; showWin: Boolean; begin path_params:= 'ping.exe 8.8.8.8'; workDir:= ''; sec:= 5; showWin:= True; execAndWait(path_params, workDir, sec, showWin); end; |
Параметры
path_params - путь к приложению с параметрами
workDir - рабочая директория приложения
sec - максимальное время ожидания завершения в секундах (0 - не ожидать)
showWin - показать окно запускаемого приложения или скрыть
Результат
True, если удалось запустить приложение, False - если нет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
function execAndWait(appPath_Params, workDir: WideString; sec: Integer; showWin: Boolean): Boolean; var si : TStartupInfo; i:Integer; procID : TProcessInformation; path_params, wdir: PChar; begin if appPath_Params <> '' then path_params:= PChar(appPath_Params) else path_params:= nil; if workDir <> '' then wdir:= PChar(workDir) else wdir:= nil; zeroMemory(@si,sizeof(si)); si.cb := sizeof(si); if showWin = True then si.wShowWindow:= 1 else si.wShowWindow:= 0; si.dwFlags := STARTF_USESHOWWINDOW; zeroMemory(@procID,sizeof(procID)); if not CreateProcess(nil, path_params, nil, nil, false, 0, nil, wdir, si, procID ) then begin Result:= False; exit; end else begin Result:= True; if sec = 0 then exit; i := 0; while i < sec * 20 do begin if waitForSingleObject(procID.hProcess, 0) = 0 then begin closehandle(procID.hProcess); closeHandle(procID.hThread); Break; end; sleep(50); Application.ProcessMessages; inc(i); end; end; end; |