Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
ВнизЗавершение процессов Найти похожие ветки
← →
Alexa (2005-08-10 14:31) [0]Уважаемые мастера! С WinAPI работаю совсем недавно. Возникло следующее затруднение: из моего приложения с помощью CreateProcess запускаю на выполение .bat файл, который в свою очередь тоже запускает некоторые программы (напр. rar). По истечение некоторого времени, если текущий процесс (исполняемый bat файл) незавершен, то он завершается с помощью terminateProcess. Но программы уже запущенные из бата своб работу не завершают. Вопрос такой: как можно было бы завершить их работу?
function RunCommandString(com:string; timeout:integer):integer;
var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
res: DWORD;
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
if not CreateProcess( nil,
Pchar(com),
nil,
nil,
False,
0,
nil,
nil,
si,
pi)
then
begin
ShowMessage("CreateProcess failed." );
Exit;
end;
res:=WaitForSingleObject( pi.hProcess, timeout); //Ожидание завершения процесса
if res = WAIT_TIMEOUT then //Если время процесса истекло
TerminateProcess(pi.hProcess,0); //то завершение процесса
result:=integer(res);
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
end;
← →
Lamer@fools.ua © (2005-08-10 14:33) [1]>Вопрос такой: как можно было бы завершить их работу?
TerminateProcess()
← →
Digitman © (2005-08-10 14:36) [2]
> как можно было бы завершить их работу?
в общем случае - никак.
в частном же -зная имена стартованных пакетным заданием процессов завершить их точно так же (принудительно), с пом. TerminateThread
← →
Alexa (2005-08-10 14:51) [3]Некоторое уточнение: как же можно узнать имена стартованных процессов (если только не просматривать текст самого bat)?
← →
Digitman © (2005-08-10 14:55) [4]кроме как парсить bat-файл - никак.
мало ли кто, где и какие процессы стартовал в системе ..
← →
BiN © (2005-08-10 15:05) [5]С помощью Process32First/Next можно получить список процессов и вычленить те, создателем которых является процесс интерпретирующий целевой bat-файл.
← →
Digitman © (2005-08-10 15:09) [6]
> процесс интерпретирующий целевой bat-файл
таких может быть великое множество
← →
BiN © (2005-08-10 15:18) [7]Digitman © (10.08.05 15:09) [6]
> процесс интерпретирующий целевой bat-файл
таких может быть великое множество
Разве?
автор пишет: " ...из моего приложения с помощью CreateProcess запускаю на выполение .bat файл, который в свою очередь тоже запускает некоторые программы (напр. rar)."
В PROCESS_INFORMATION идентификатор какого процесса?
← →
Digitman © (2005-08-10 15:25) [8]
> В PROCESS_INFORMATION идентификатор какого процесса?
под НТ - ntvdm.exe (виртуальная ДОС-машина НТ)
каждый отдельно взятый пак.файл будет стартован и исполнен под управлением отдельного экземрпляра вирт.ДОС-машины
← →
Leonid Troyanovsky © (2005-08-10 15:30) [9]
> Digitman © (10.08.05 15:25) [8]
>
> > В PROCESS_INFORMATION идентификатор какого процесса?
>
>
> под НТ - ntvdm.exe (виртуальная ДОС-машина НТ)
Для 16 битных.
--
Regards, LVT.
← →
Digitman © (2005-08-10 15:32) [10]
> Leonid Troyanovsky © (10.08.05 15:30) [9]
rar.exe и есть, насколько я представляю, 16-битная ДОС-задача
← →
BiN © (2005-08-10 15:35) [11]Leonid Troyanovsky © (10.08.05 15:30) [9]
Для 16 битных.
вдогонку
Автор ветки, к сожалению, не указал, как именно он "запускает на выполнение" пакетные файлы. По умолчанию же для их открытия служит процесс, путь к образу которого прописан в %COMSPEC%.
← →
Игорь Шевченко © (2005-08-10 15:39) [12]Leonid Troyanovsky © (10.08.05 15:30) [9]
BiN © (10.08.05 15:35) [11]
<offtopic>
Мои поздравления, мастера!
</offtopic>
← →
BiN © (2005-08-10 16:01) [13]Игорь Шевченко © (10.08.05 15:39) [12]
<offtopic>
Эта..., спасибо, что ли... как-то неожиданно всё
</offtopic>
← →
alpet © (2005-08-10 18:59) [14]в [5] указано нормальное решение.
В качестве альтернативы можешь написать отдельную утилиту для запуска процессов, и применять ее в .bat файле везде где выполняются другие процессы (т.е. подобие start.exe).
Отдельная утилита запускает на выполнение файл указанный к строке параметров (CreateProcess), и ждет либо его завершения, либо установления некоторого общего события (управляемого из программы запустившей .bat файл), с помощью функции WaitForMultipleObjects. Если в главной програме срабатывает таймаут, она устанавливает событие (SetEvent) в сигнальное состояние, после чего все утилиты, использующие это событие завершают запущенные ими процессы.
← →
Alexa (2005-08-11 12:20) [15]Большое всем спасибо за советы! все получилось!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c