Search code examples
inno-setuptaskkill

Kill process before (re)install using "taskkill /f /im" in Inno Setup


I install a service/daemon, which needs to be killed before uninstall and reinstall.

I already found out how to do it for uninstall:

[UninstallRun]
Filename: "taskkill"; Parameters: "/im ""My Service.exe"" /f"; Flags: runhidden

The [Run] section, however, runs after install, so I can't use it for that. What is the best way to kill the process using taskkill before install?

Please note that I specifically want to kill the process. A more complex solution using IPC offers no benefits in my case, I just want to execute taskkill before installing a particular file.


Solution

  • I found a way using the BeforeInstall parameter and a simple Pascal Script function in the code section. I added a string parameter so it can be reused for multiple processes.

    [Files]
    Source: "My Service 1.exe"; DestDir: "{app}"; Flags: ignoreversion; \
        BeforeInstall: TaskKill('My Service 1.exe')
    Source: "My Service 2.exe"; DestDir: "{app}"; Flags: ignoreversion; \
        BeforeInstall: TaskKill('My Service 2.exe')
    
    [Code]
    procedure TaskKill(FileName: String);
    var
      ResultCode: Integer;
    begin
        Exec('taskkill.exe', '/f /im ' + '"' + FileName + '"', '', SW_HIDE,
         ewWaitUntilTerminated, ResultCode);
    end;