У меня была эта проблема, и я написал короткую программу на C ++, чтобы убить некоторые процессы, которые могут находиться в зависшем состоянии и, таким образом, не могут отвечать на сообщения, в которых говорится о смерти. Я делал это только с приложениями, которые были частью моего продукта, а не с системными приложениями.
Вы могли бы сделать то же самое в скрипте Pascal, если хотите испытать боль от правильности получения параметров вызова. Вот схема того, что я сделал:
Получить местоположение CSIDL_PROGRAM_FILES. Inno setup может сделать это с помощью констант {pf} или {pf32}. Или вызовите функцию API SHGetSpecialFolderLocation для Windows.
Установите строку, равную пути к процессу, который вы хотите уничтожить, например
Строка target = pf + "Mycompany / MyAppFolder / myHelperApp.exe"
Вызовите API-функцию Windows CreateToolhelp32Snapshot, которая возвращает список запущенных процессов.
Просмотрите этот возвращенный список для своей цели, используя OpenProcess и API-интерфейс GetModuleFleNameEx Windows API.
Когда вы находите целевой объект, вызовите API-интерфейс Windows TerminateProcess для дескриптора целевого процесса.