Деинсталляция завершается неудачно, потому что программа работает. Как выполнить проверку Inno Setup для запуска процесса перед попыткой удаления?
Inno Setup не может удалить компоненты во время удаления, потому что моя программа все еще работает и исполняемый файл не может быть удален. Как мне проверить, запущен ли он, прежде чем разрешить удаление?
5 ответов
Проверьте эти
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
Как перечислять приложения с помощью Win32 API (эта ссылка на немецкую версию, так как по какой-то причине я не могу найти английскую версию KB175030
или попробуйте переведенную в Google версию KB175030-DE
Мы использовали другой способ, чем описано выше. Поскольку это удаление, мы можем убить приложение и удалить его. Самый простой способ, когда вы не можете использовать AppMutex: (относится к действительно убить процесс в Windows)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
Надеюсь, кто-нибудь поможет этому. Я долго искал это.
Попробуйте это решение! У меня были проблемы с другими решениями, закрывающими приложение, но 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;
Основные подпорки к первоисточнику этого решения.
Использовать 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
вызов.
Обратите внимание, что для установщика вам не нужно кодировать это. Установщик имеет встроенный менеджер перезапуска.
См. Процесс Kill перед (пере) установкой с помощью "taskkill /f /im" в Inno Setup.
возможно, добавьте это свойство
CloseApplications=yes, он будет просматривать все элементы [Files] и [InstallDelete] и работать с помощью диспетчера перезагрузки Windows.
https://jrsoftware.org/ishelp/index.php?topic=setup_closeapplications