Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как убить задачу, зная только имя EXE

Delphi , Программа и Интерфейс , EXE файл

Как убить задачу, зная только имя 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;

Это фрагмент кода на языке программирования Delphi, демонстрирующий, как остановить (убить) процесс по имени исполняемого файла. Функция KillTask принимает параметр ExeFileName, который является именем EXE-файла для остановки.

Обзор кода:

  1. Класс uses импортирует три модуля: Tlhelp32, Windows и SysUtils. Эти модули предоставляют функции для работы с процессами, вызовы API Windows и системные утилиты.
  2. Функция KillTask объявлена с одним параметром типа string - ExeFileName.
  3. Функция инициализирует несколько переменных:
    • FSnapshotHandle: обрабатываемый handle для снэпшота всех работающих процессов.
    • FProcessEntry32: структура, которая хранит информацию о процессе.
    • ContinueLoop: флаг boolean, указывающий, должен ли цикл продолжаться.
  4. Функция использует функцию CreateToolhelp32Snapshot для создания снэпшота всех работающих процессов.
  5. Затем функция проходит по каждому процессу в снэпшоте с помощью функций Process32First и Process32Next. Для каждого процесса она проверяет, если имя исполняемого файла совпадает с параметром ExeFileName (игнорируя регистр). Если совпадение найдено, функция использует функцию TerminateProcess для остановки процесса.
  6. Наконец, функция закрывает handle снэпшота с помощью функции CloseHandle.

Код спроектирован для эффективности и безопасности:

  • Используется снэпшот всех работающих процессов вместо сканирования всей системы в поисках конкретных процессов.
  • Игнорируется регистр при сравнении имен исполняемых файлов.
  • Остановка процесса происходит асинхронно, что означает, что процесс не будет остановлен сразу, а будет остановлен в будущем.

Код может использоваться для остановки задач (процессов) по их имени исполняемого файла. Например, если вы хотите остановить все экземпляры Notepad, вы бы вызвали KillTask('notepad.exe').

Замечание: данный код предназначен только для образовательных целей и не должен использоваться для остановки критических системных процессов без соответствующего предостережения.

Альтернативное решение:

Вместо использования снэпшота всех работающих процессов можно использовать функцию ProcessList из модуля Tlhelp32, чтобы получить список работающих процессов. Затем можно проходить по этому списку и проверять, если каждый процесс имеет имя исполняемого файла, совпадающее с параметром ExeFileName. Это подход может быть более эффективным для небольших количеств процессов.

Пример:

function KillTask(ExeFileName: string): integer;
var
  ProcessEntry: TProcessEntry32;
begin
  Result := 0;
  ProcessList(ProcessList, @ProcessEntry);
  while (ProcessEntry.th32ProcessID <> 0) do
  begin
    if UpperCase(ProcessEntry.szExeFile) = UpperCase(ExeFileName) then
      Result := TerminateProcess(GetProcessHandle(ProcessEntry.th32ProcessID), 0);
    ProcessList(@ProcessEntry, @ProcessEntry);
  end;
end;

В этом коде используется функция ProcessList для получения списка работающих процессов и проходит по этому списку, чтобы найти совпадения имени исполняемого файла. Функция TerminateProcess используется для остановки каждого найденного процесса.

Данная статья описывает функцию на языке Delphi, которая позволяет убить задачу в системе, зная только имя EXE-файла.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: EXE файл ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 11:24:33/0.003849983215332/0