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

Вниз

Завершение процессов   Найти похожие ветки 

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

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

Наверх




Память: 0.5 MB
Время: 0.025 c
1-1126847021
Fostr
2005-09-16 09:03
2005.10.09
Поворот картинок


3-1124967457
sashuly
2005-08-25 14:57
2005.10.09
ADOQuery или ADOTable


3-1125159074
Akris
2005-08-27 20:11
2005.10.09
Как передать коннект к базе Firebird из программы в dll?


2-1125320467
PIF
2005-08-29 17:01
2005.10.09
Целое число или нет


2-1125325409
SergP.
2005-08-29 18:23
2005.10.09
Проблема с SQL запросом.