Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.03.16;
Скачать: CL | DM;

Вниз

Как дождаться исполнения консольного приложения? Подскажите.   Найти похожие ветки 

 
sunwise   (2007-08-02 08:29) [0]

Некоторое консольное приложение запускается из основной программы.
Необходимо дождаться его выполнения и перейти к дальнейшим действиям. Полагаю, что надо использовать:
ExecuteWait; или
ExecuteIORedirect; или
ExecuteConsoleAppIORedirect.

Сама консоль во время исполнения не видна. Время испонения - неизвестно. Консоль после исполнения возвращает - ОК.

Подскажите плиз как сделать правильно, и параметры функций Execute.


 
kichrot ©   (2007-08-02 10:17) [1]

Вот код маленькой проги командной строки по мотивам ExecuteWait.
Может даст Вам ответы на ваш вопрос.

program ExeWait;
{Программа запуска других программ с параметрами:
-AP: - имя запускаемого файла
-CL: - параметры командной строки
-DD: - рабочий каталог
-SW: - состояние окна
-TO: - время ожидания окончания раьоты запускаемой программы в милисекундах

Значения -AP, -CL, -DD заключать в кавычки

Значения -TO:
     0 - время ожидания не ограничено
     положительное значение - закончить ожидание по истечении времени и не дожидаться окончания процеса
     отрицательное значение - по истечении времени ожидания принудительно убить процес

Значения -SW:
Числовое значение     Константа из Windows.inc       Назначение
       0              SW_HIDE                         Скрыть окно и активировать другое окно.

       1              SW_SHOWNORMAL                   Показать и активировать окно. Если окно
                                                      свернуто или максимизировано, оно будет
                                                      возвращено к нормальным размерам.
                                                     
       2              SW_SHOWMINIMIZED                Активировать окно и свернуть его.

       3              SW_SHOWMAXIMIZED                Активировать окно и распахнуть его на весь экран.

       4              SW_SHOWNOACTIVATE               Показать окно с обычными размерами и положением,
                                                      но не делать его активным.

       5              SW_SHOW                         Показать окно с обычными размерами и положением
                                                      и сделать его активным.

       6              SW_MINIMIZE                     Свернуть окно и сделать активным окно, следующее
                                                      за ним по Z-порядку.

       7              SW_SHOWMINNOACTIVE              Свернуть окно и при этом не делать его активным.

       8              SW_SHOWNA                       Показать окно с обычными размерами и параметрами,
                                                      но при этом не делает его активным.

       9              SW_RESTORE                      Восстановить обычные размеры и положение свернутого
                                                      или максимизированного окна, после чего активировать это окно.

}

uses Windows,KOL;

var
b: Integer;
PCnt: Integer;
AppPath: String;
CmdLine: String;
DfltDirectory: String;
Show: DWORD;
TimeOut: DWORD;
ProcInfo: TProcessInformation;
Kil: Boolean;
PrID: PDWORD;

   function ExecuteWaitEx( const AppPath, CmdLine, DfltDirectory: KOLString;
            Show: DWORD; TimeOut: DWORD; ProcID: PDWORD): Boolean;
   var Flags: DWORD;
       Startup: TStartupInfo;
       ProcessInfo: TProcessInformation;
       DfltDir: PKOLChar;
       App: String;
   begin
       Result := FALSE;
       Flags := CREATE_NEW_CONSOLE;
       if Show = SW_HIDE then Flags := Flags or {$IFDEF F_P}$08000000{$ELSE}CREATE_NO_WINDOW{$ENDIF};
       FillChar( Startup, SizeOf( Startup ), 0 );
       Startup.cb := Sizeof( Startup );
       Startup.wShowWindow := Show;
       Startup.dwFlags := STARTF_USESHOWWINDOW;
       if ProcID <> nil then ProcID^ := 0;
       DfltDir := nil;
       if DfltDirectory <> "" then DfltDir := PKOLChar( DfltDirectory );
       App := AppPath;
       if (pos( " ", App ) > 0) and (pos( """, App ) <= 0) then App := """ + App + """;
       if (App <> "") and (CmdLine <> "") then App := App + " ";
       if CreateProcess( nil, PKOLChar( App + CmdLine ), nil, nil, FALSE, Flags, nil, DfltDir, Startup, ProcessInfo ) then
       begin
           ProcInfo := ProcessInfo;//мое
           if WaitForSingleObject( ProcessInfo.hProcess, TimeOut ) = WAIT_OBJECT_0 then
           begin
             CloseHandle( ProcessInfo.hProcess );
             Result := TRUE;
           end
           else
           begin
             if ProcID <> nil then ProcID^ := ProcessInfo.hProcess;
           end;
           CloseHandle( ProcessInfo.hThread );
       end;
   end;

   procedure MB(S: String);
   begin
       MessageBox(0,PChar(S),PChar("ExeWait"),(MB_SYSTEMMODAL)+(MB_ICONERROR) );
   end;

   procedure PPS(P: String;NP: Integer);
   const
   P1: String="-AP";
   P2: String="-CL";
   P3: String="-DD";
   P4: String="-SW";
   P5: String="-TO";
   var
   S: String;
   SS: String;
   begin
       S := P;
       if Parse( S, ":" ) = P1 then
       begin
           AppPath := CopyEnd( S, 1);
           Exit;
       end;
       S := P;
       if Parse( S, ":" ) = P2 then
       begin
           CmdLine := CopyEnd( S, 1);
           Exit;
       end;
       S := P;
       if Parse( S, ":" ) = P3 then
       begin
           DfltDirectory := CopyEnd( S, 1);
           Exit;
       end;
       S := P;
       if Parse( S, ":" ) = P4 then
       begin
           Show := Str2Int(CopyEnd( S, 1));
           Exit;
       end;
       S := P;
       if Parse( S, ":" ) = P5 then
       begin
           SS := S;
           if Parse( S, "-" ) = "" then
           begin
               Kil := True;
               TimeOut := Str2Int( S);
           end
           else
           begin
               Kil := False;
               TimeOut := Str2Int(SS);
           end;
           if TimeOut = 0 then
           begin
               TimeOut := INFINITE;
           end;
           Exit;
       end;
       MB("Не верный параметр № "+ Int2Str(NP));
       Halt;
   end;

begin
   Kil := False;
   AppPath := "";
   CmdLine := "";
   DfltDirectory := "";
   Show := 4;
   TimeOut := INFINITE;
   PrID := nil;
   PCnt := ParamCount;
   if (PCnt>0)and (PCnt<5) then
   begin
       for b := 1 to PCnt do
       begin
           PPS(ParamStr(b), b);
       end;
       if AppPath = "" then
       begin
           MB("Не задано имя запускаемого файла.");
           Exit;
       end;
       if DfltDirectory = "Def" then
       begin
           DfltDirectory := GetStartDir;
       end;
       if (DfltDirectory<>"")and(DirectoryExists( DfltDirectory ) = False) then
       begin
           MB("Рабочий каталог не существует.");
           Exit;
       end;
       if (Show < 0) or (Show > 9) then
       begin
           MB("не верно задан параметр состояния окна.");
           Exit;
       end;
       ExecuteWaitEx( AppPath, CmdLine, DfltDirectory, Show, TimeOut, PrID);
       if Kil = True then
       begin
           ProcInfo.hProcess := OpenProcess(PROCESS_TERMINATE, False,
           ProcInfo.dwProcessId);
           TerminateProcess(ProcInfo.hProcess, 0);
           CloseHandle(ProcInfo.hProcess);
           //CloseHandle(ProcInfo.hThread);
       end;
   end
   else
   begin
       MB("Не верное число параметров");
       Exit;
   end;
end.


 
sunwise   (2007-08-02 10:50) [2]

2 kichrot. Большое спасибо. Сам тоже поразбирался, все получилось. Со временем ожидания было непонятно в чем измеряется, установил экспериментально, что в миллисекундах. По времени - (0 - время ожидания неограничено), и состоянию окна -спасиб за подсказку!


 
sunwise   (2007-08-02 10:54) [3]

хм... проверил. 0 - время ожидания неограничено - не работает... :(


 
Дмитрий К ©   (2007-08-02 11:18) [4]


> хм... проверил. 0 - время ожидания неограничено - не работает... :(

INFINITE


 
sunwise   (2007-08-02 12:06) [5]

2Дмитрий К
Спасиб, работает...



Страницы: 1 вся ветка

Текущий архив: 2008.03.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
2-1202928676
savyhinst
2008-02-13 21:51
2008.03.16
HOWTO_ISAPI


15-1202263587
ingwar
2008-02-06 05:06
2008.03.16
Delphi для обучения студентов


2-1203493920
Александр
2008-02-20 10:52
2008.03.16
Excel в OleContainer


2-1203410091
ryden
2008-02-19 11:34
2008.03.16
результат sql запроса


8-1150913139
Layner
2006-06-21 22:05
2008.03.16
Примеры для TVideoGrabber (v 7.2-7.3) ищу