Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TerminateProcess 
:(
    Опции темы
Гость_Over G
Дата 18.8.2003, 16:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Как закрыть процесс нужного файла ?

Если можно то функцию с описаниями, ато я в делфи полный профан.

  Вверх
p0s0l
Дата 18.8.2003, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Не проверял, но вот из FAQ:
Код
{ Эта небольшая функция закрывает приложения, соответствующие заданному имени .exe.  
 Пример: KillTask('notepad.exe');  
                 KillTask('iexplore.exe'); }  

uses  
 Tlhelp32, Windows, SysUtils;  

function KillTask(ExeFileName: string): integer;  
const  
 PROCESS_TERMINATE=$0001;  
var  
 ContinueLoop: BOOL;  
 FSnapshotHandle: THandle;  
 FProcessEntry32: TProcessEntry32;  
begin  
 result := 0;  

 FSnapshotHandle := CreateToolhelp32Snapshot  
                    (TH32CS_SNAPPROCESS, 0);  
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);  
 ContinueLoop := Process32First(FSnapshotHandle,  
                                FProcessEntry32);  

 while integer(ContinueLoop) <> 0 do  
 begin  
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  
        UpperCase(ExeFileName))  
    or (UpperCase(FProcessEntry32.szExeFile) =  
        UpperCase(ExeFileName))) then  
     Result := Integer(TerminateProcess(OpenProcess(  
                       PROCESS_TERMINATE, BOOL(0),  
                       FProcessEntry32.th32ProcessID), 0));  
   ContinueLoop := Process32Next(FSnapshotHandle,  
                                 FProcessEntry32);  
 end;  

 CloseHandle(FSnapshotHandle);  
end;



--------------------
С уважением, г-н Посол.
PM   Вверх
0FF
Дата 18.8.2003, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 10.8.2003

Репутация: нет
Всего: нет



Знакомая трабла, сам с такой сталкнулся, ришение так и не нашел.

2 p0s0l
Этот пример действует только для Win9x тк там szFileName Возвращает путь к файлу + его имя.
И соответвенно можно написать killtask('c:\Folder\File.exe');

А в WinXP (и наверное в других виндах семейства Nt) такая тема не катит
тк, в WinXP szFileName - это не полный путь к файлу + его имя, а только его имя.
поэтому функция killtask('c:\Folder\File.exe'); не даст вообще ни какого результата.
только так killtask('File.exe'); но таким макаром будут убиты все одоимённые файлы.
А надо убить только один.

PM MAIL   Вверх
p0s0l
Дата 18.8.2003, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Теперь можно и с путем указывать и без пути:

Код
function KillTask (ExeFileName: string) : boolean;
var
 ssh1, ssh2 : THandle;
 pe32 : TProcessEntry32;
 me32 : TModuleEntry32;
begin
 result := false;
 ExeFileName := AnsiUpperCase(ExeFileName);

 ssh1 := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
 pe32.dwSize := SizeOf(pe32);
 me32.dwSize := SizeOf(me32);

 if Process32First(ssh1, pe32) then
 repeat
   Result := ExeFileName = AnsiUpperCase(pe32.szExeFile);

   if not Result then
     if ExtractFileName(ExeFileName) = AnsiUpperCase(ExtractFileName(pe32.szExeFile)) then
     begin
       ssh2 := CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, pe32.th32ProcessID);
       if Module32First(ssh2, me32) then
       repeat
         if (ExeFileName = AnsiUpperCase(me32.szExePath)) then
         begin
           Result := true;
           Break;
         end;
       until not Module32Next(ssh2, me32);
       CloseHandle(ssh2);
     end;

   if Result then
   begin
     Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, pe32.th32ProcessID), 0);
     Break;
   end;
 until not Process32Next(ssh1, pe32);

 CloseHandle (ssh1);
end;


Проверял в Xp - убивает winamp.exe как с путем так и без пути...




--------------------
С уважением, г-н Посол.
PM   Вверх
0FF
Дата 19.8.2003, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 10.8.2003

Репутация: нет
Всего: нет



Первый break не нужен.
PM MAIL   Вверх
p0s0l
Дата 19.8.2003, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Цитата
Первый break не нужен.

Если найден модуль с нужным именем, то зачем искать дальше ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Fantasist
Дата 19.8.2003, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Наверно имелось в виду:

Цитата
       
      repeat
          if (ExeFileName = AnsiUpperCase(me32.szExePath)) then
            Result := true;
      until (not Module32Next(ssh2, me32)) or (Result);


и break не нужен.


--------------------
Волны гасят ветер...
PM MAIL   Вверх
Fantasist
Дата 19.8.2003, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: нет
Всего: 41



Правда тогда и второй break не нужен. Вместо:

Код

if Result then
  begin
    Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, pe32.th32ProcessID), 0);
    Break;
  end;
until not Process32Next(ssh1, pe32);


ставим:

Код

until (not Process32Next(ssh1, pe32)) or (Result);

if (Result) then
     Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, false, pe32.th32ProcessID), 0);


Это сообщение отредактировал(а) Fantasist - 19.8.2003, 21:57


--------------------
Волны гасят ветер...
PM MAIL   Вверх
p0s0l
Дата 20.8.2003, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Ладно, ладно... Только такое ощущение, что писал не в форум, а в какой-то раздел "этюды"...
Сразу укорачивать и упрощать начали... smile


--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 20.8.2003, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



И если уж дело дошло до этого, то мой вариант (с break) и быстрее, и меньше памяти занимает: smile
(это то что компилит Delphi 7.0)

Вариант с break:
Код

mov bl, $01       // Result := true
jmp +$11          // Break   
lea edx, [ssh2]   // 
mov eax, edi      // edi = offset me32
call Module32Next //
test eax, eax     //
jnz -$4c          // until 


А если делать без break, длина +5 байт:
Код

mov bl, $01       // Result := true
lea edx, [ssh2]
mov eax, edi
call Module32Next
cmp eax, $01
sbb eax, eax
neg eag
or al, bl         // or Result
jz -$51           // until 


И если уж решили делать без break'а, то until надо делать таким: until Result or (not Module32Next...);
Таким образом длина -2 байта:
Код

test bl, bl       // проверям Result
jnz +$11          // и сразу же выход из цикла, если Result = true
lea edx, [ssh2]
mov eax, edi
call Module32Next
test eax, eax
jnz -$4e          // until


smile


--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.