Показать сообщение отдельно
  #5  
Старый 03.04.2009, 18:58
"Hatchet" Harry "Hatchet" Harry вне форума
Прохожий
 
Регистрация: 22.03.2009
Сообщения: 30
Репутация: 10
По умолчанию

Вот еще такой вопросик назрел, как можно отследить выполнение пакетного (.bat) файла подобного(первый пост) содержания. Например мне нужно убить этот файл, если он выпоняется. Но непосредственно сам .bat-файл не убьёшь, т.к. как только он запускается, написанные в нём команды построчно передаются процессу cmd.exe а сам .bat-файл в процессах не отображается(т.е. он как бы в память к cmd.exe подгружается). Следовательно нужно гасить cmd.exe. По имени процесса или по хендлу окна убивать не вариант, т.к. если, допустим в это же время выполняется какой-нить другой процесс cmd.exe то он тоже убьётся(имена и хэндлы окон у двух запущенных cmd.exe будут одинаковы). Как обнаружить именно нужный cmd.exe (выполнение которого вызвал .bat-файл)
Если нужно по имени процесса убить, то пользовал такую функцию:
Код:
function KillTask(ExeFileName:string):integer;
const
PROCESS_TERMINATE=$0001;
var
Co:BOOL;
FS:THandle;
FP:TProcessEntry32;
begin
result:=0;
FS:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FP.dwSize:=Sizeof(FP);
Co:=Process32First(FS,FP);
while integer(Co) <> 0 do
begin
if ((UpperCase(ExtractFileName(FP.szExeFile))=UpperCase(ExeFileName)) or
(UpperCase(FP.szExeFile)=UpperCase(ExeFileName))) then
Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),
FP.th32ProcessID),0));
Co:=Process32Next(FS,FP);
end;
CloseHandle(FS);
end;
Ответить с цитированием