Подтвердить что ты не робот

Удаление происходит с ошибкой, так как программа запущена. Как сделать проверку Inno Setup для запуска процесса до попытки удаления?

Inno Setup не удаляет компоненты во время удаления, потому что моя программа все еще запущена, и исполняемый файл не может быть удален. Как его проверить, чтобы убедиться, что он запущен, прежде чем разрешить удаление?

4b9b3361

Ответ 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

KB175030 DE → EN

Ответ 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.