Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "KOL";
Текущий архив: 2008.03.16;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1202479970
ketmar
2008-02-08 17:12
2008.03.16
чудные каменты…


2-1203413997
KyRo
2008-02-19 12:39
2008.03.16
Компонент TGauge


15-1202464474
Kostafey
2008-02-08 12:54
2008.03.16
Как найти ветку форума по ее id?


2-1203325601
abhtr
2008-02-18 12:06
2008.03.16
Как определить в какой колонке DBGrid-а находится курсор?


4-1184169587
__Unknown__
2007-07-11 19:59
2008.03.16
TThread





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский