Inno Setup не удаляет компоненты во время удаления, потому что моя программа все еще запущена, и исполняемый файл не может быть удален. Как его проверить, чтобы убедиться, что он запущен, прежде чем разрешить удаление?
Удаление происходит с ошибкой, так как программа запущена. Как сделать проверку Inno Setup для запуска процесса до попытки удаления?
Ответ 1
Проверьте эти
Inno Setup: обнаружение экземпляров, запущенных в любой пользовательской сессии с помощью AppMutex
Inno Setup: работает ли приложение?
Inno Setup: обнаружение, если приложение работает
Существует несколько способов. Если ваша программа определяет использование мьютекса
[Setup]
AppMutex=MyMutexName
или для указанного мьютекса в разделе Code
function CheckForMutexes (Mutexes: String): Boolean;
Вы также можете использовать
function FindWindowByClassName (const ClassName: String): Longint;
чтобы получить дескриптор окна по имени класса и отправить его сообщениям.
Или получить его по имени
function FindWindowByWindowName (const WindowName: String): Longint;
Или вы используете один из нескольких DLL файлов для этого конкретного случая использования
Или сделайте это самостоятельно после прочтения
Как закрыть приложение "Чисто" в Win32
Как перечислить приложения с помощью API Win32 (эта ссылка связана с немецкой версией, так как по какой-то причине я не могу найти английскую версию KB175030
или попробуйте переведенную google версию KB175030-DE
Ответ 2
Мы использовали другой способ, чем описано выше. Поскольку это удаление, мы можем убить приложение и его unistall. Самый простой способ, когда вы не можете использовать AppMutex: (связанный с Действительно убить процесс в Windows)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
Надеюсь, кто-то поможет этому. Я долго искал это.
Ответ 3
Попробуйте это решение! У меня были проблемы с другими решениями, закрывающими приложение, но Inno Setup все еще считал, что установленные файлы заблокированы.
Не забудьте указать свои константы:
#define MyAppName "AppName"
#define MyAppExeName "AppName.exe"
[Code]
function InitializeUninstall(): Boolean;
var ErrorCode: Integer;
begin
ShellExec('open','taskkill.exe','/f /im {#MyAppExeName}','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','tskill.exe',' {#MyAppName}','',SW_HIDE,ewNoWait,ErrorCode);
result := True;
end;
Основные реквизиты исходного источника этого решения.
Ответ 4
Используйте AppMutex
директива, чтобы предотвратить деинсталляцию при запуске приложения.
[Setup]
AppMutex=MyProgMutex
Приложение должно создать мьютекс, указанный в директиве. См. Связанную документацию по директиве AppMutex
для примеров.
Если вы хотите, чтобы программа удаления удалила приложение, когда он все еще запущен, используйте вместо этого этот код:
function InitializeUninstall(): Boolean;
var
ErrorCode: Integer;
begin
if CheckForMutexes('MyProgMutex') and
(MsgBox('Application is running, do you want to close it?',
mbConfirmation, MB_OKCANCEL) = IDOK) then
begin
Exec('taskkill.exe', '/f /im MyProg.exe', '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
end;
Result := True;
end;
Как и в случае с директивой AppMutex
выше, приложение должно создать мьютекс, указанный в вызове CheckForMutexes
.
Обратите внимание, что для установщика вам не нужно это кодировать. У установщика встроен диспетчер перезагрузки.
См. Процесс убийства до (повторной) установки с использованием" taskkill/f/im " в Inno Setup.