Uninstall fails because program is running. How do I make Inno Setup check for running process prior to attempting delete?

后端 未结 4 703
死守一世寂寞
死守一世寂寞 2020-12-05 02:56

Inno Setup fails to remove components during uninstall cause my program is still running and the executable cannot be deleted. How do I have it check to see if it is running

相关标签:
4条回答
  • 2020-12-05 03:20

    Use the AppMutex directive to prevent the uninstaller from proceeding, when an application is running.

    [Setup]
    AppMutex=MyProgMutex
    

    The application has to create the mutex specified by the directive. See the linked AppMutex directive documentation for examples.


    If you want to have the uninstaller kill the application, when it is still running, use this code instead:

    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;
    

    As with the AppMutex directive above, the application has to create the mutex specified in the CheckForMutexes call.


    Note that for installer, you do not have to code this. The installer has restart manager built-in.
    See Kill process before (re)install using "taskkill /f /im" in Inno Setup.

    0 讨论(0)
  • 2020-12-05 03:24

    Try this solution! I had issues with other solutions closing the app, but Inno Setup still thought the installed files were locked.

    Remember to define your constants:

    #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;
    

    Major props to the original source of this solution.

    0 讨论(0)
  • 2020-12-05 03:30

    Check these

    Inno Setup: Detect instances running in any user session with AppMutex

    Inno Setup: Is application running?

    Inno Setup: Detect if an application is running

    There are several ways. If your program defines a mutex use

    [Setup]
    AppMutex=MyMutexName
    

    or for a specified mutex in the Code section

    function CheckForMutexes (Mutexes: String): Boolean;
    

    You could also use

    function FindWindowByClassName (const ClassName: String): Longint; 
    

    to get the window handle by class name and send it messages.

    Or get it by the name

    function FindWindowByWindowName (const WindowName: String): Longint;
    

    Or you use one of several DLL files for this specific use case

    • PSVince
    • FindProcDLL

    Or do it yourself after reading

    How To Terminate an Application "Cleanly" in Win32

    How To Enumerate Applications Using Win32 APIs (this one links to the german version as for some reason I can't find the english version of KB175030

    or try the google translated version of the KB175030-DE

    KB175030 DE -> EN

    0 讨论(0)
  • 2020-12-05 03:40

    We used an other way than described above. Because this is an uninstallation we can kill the application and unistall it. The simpliest way, when u can't use AppMutex: (related to Really killing a process in Windows)

    [UninstallRun]
    Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
    

    Hope somebody will help this. I searched a long time for this.

    0 讨论(0)
提交回复
热议问题