Форум: "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