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

Остановка процесса по имени в Delphi

Delphi , Программа и Интерфейс , Процессы и Сервисы

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

Проблема

Иногда возникает необходимость принудительно завершить работу процесса, зная только его имя, например, program.exe. В таком случае, стандартные методы получения пути к процессу через PID не подходят, так как у нас уже есть имя процесса, и нам необходимо его использовать для остановки.

Решение

Для решения данной задачи можно использовать функцию KillTask, которая принимает имя исполняемого файла в качестве аргумента и завершает все процессы с этим именем. Вот пример такой функции:

uses
  TlHelp32;
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;

Обратите внимание, что функция KillTask может завершать несколько процессов с одинаковым именем, если такие процессы существуют. Также функция возвращает количество успешно завершенных процессов.

Важные замечания

  • Убедитесь, что использование такой функции оправдано, так как принудительное завершение процессов может привести к потере данных.
  • Функция KillTask может не работать на всех версиях Windows, так как, согласно найденной информации, она предназначена для Windows 9x/ME/2000/XP. Однако, было подтверждено её работоспособность на Windows 7/10.

Альтернативный подход

Также существует альтернативный способ остановки процесса, используя функцию FindWindow, которая пытается закрыть окно, ассоциированное с именем процесса. Однако, этот метод не всегда корректен в случае, когда процесса не имеет визуального интерфейса или не реагирует на закрытие окна:

procedure TForm1.KillTask(ExeFileName: string);
var
  H: HWND;
begin
  H := FindWindow(nil, LPCWSTR(ExeFileName));
  if H <> 0 then
    PostMessage(H, WM_CLOSE, 0, 0);
end;

Заключение

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

Создано по материалам из источника по ссылке.

В статье рассматривается проблема и решения по принудительной остановке процесса в Delphi, используя его имя, и обсуждаются различные способы реализации этого, включая использование функций для завершения процессов и закрытия окон, а также важн


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

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




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


:: Главная :: Процессы и Сервисы ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 02:22:44/0.0013751983642578/0