Деинсталляция завершается неудачно, потому что программа работает. Как выполнить проверку 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

KB175030 DE -> RU

Мы использовали другой способ, чем описано выше. Поскольку это удаление, мы можем убить приложение и удалить его. Самый простой способ, когда вы не можете использовать 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

Другие вопросы по тегам