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 before allowing uninstall to proceed?
5 Answers
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.
-
2Does the `taskkill` kill more than one running instance of the same process ? – TLama May 21 '14 at 13:40
-
2Thanks! Yup, it kills all the instances unless you run the setup with lower privileges than the process is elevated. [+1ed anyway :)] – TLama May 22 '14 at 14:43
-
2Seems to kill the process, but the uninstaller still sees the files as locked and does not remove them. – sky-dev Nov 20 '14 at 16:42
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
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

- 53,475
- 11
- 111
- 124
-
1Awesome answer. Very thorough; thank you! The global mutex option took 5 minutes to get it right! Nothing better than that. – max Oct 20 '09 at 06:26
-
The latest English version of KB 175030 that I could find on the Wayback Machine is from February 2007: http://web.archive.org/web/20070216103757/http://support.microsoft.com/kb/175030. – Mark Berry Dec 31 '15 at 04:21
-
A couple more options for checking for a running app at this answer: http://stackoverflow.com/a/30852146/550712. – Mark Berry Jan 06 '16 at 02:21
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.

- 6,190
- 2
- 33
- 32
-
2This is great, one thing that I changed was to use a different procedure instead of "function InitializeUninstall(): Boolean;" due to the fact that this function will kill the app even if the user cancels the uninstall process whereas "procedure InitializeUninstallProgressForm;" will run only if he confirms to uninstall. – paul-2011 Dec 15 '15 at 10:28
-
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.

- 188,800
- 56
- 490
- 992
perhaps add this property
CloseApplications=yes it will look at all the [Files] and [InstallDelete] elements and work using windows restart manager
https://jrsoftware.org/ishelp/index.php?topic=setup_closeapplications

- 3,867
- 27
- 36