卸载失败,因为程序正在运行.在尝试删除之前,如何让Inno Setup检查运行过程?

max*_*max 23 inno-setup

Inno安装程序无法在卸载期间删除组件,因为我的程序仍在运行,并且无法删除可执行文件.在允许卸载之前,如何检查它是否正在运行?

jit*_*ter 22

检查这些

Inno Setup:使用AppMutex检测在任何用户会话中运行的实例

Inno Setup:应用程序正在运行吗?

Inno Setup:检测应用程序是否正在运行

有几种方法.如果您的程序定义了互斥锁使用

[Setup]
AppMutex=MyMutexName
Run Code Online (Sandbox Code Playgroud)

或者对于该Code部分中的指定互斥锁

function CheckForMutexes (Mutexes: String): Boolean;
Run Code Online (Sandbox Code Playgroud)

你也可以用

function FindWindowByClassName (const ClassName: String): Longint; 
Run Code Online (Sandbox Code Playgroud)

按类名获取窗口句柄并发送消息.

或者通过名字得到它

function FindWindowByWindowName (const WindowName: String): Longint;
Run Code Online (Sandbox Code Playgroud)

或者您为此特定用例使用多个DLL文件之一

或者在阅读后自己动手

如何在Win32中"干净地"终止应用程序

如何使用Win32 API枚举应用程序(这个链接到德语版本由于某些原因我找不到KB175030的英文版本

或者试试KB175030-DE的谷歌翻译版本

KB175030 DE - > EN


kdo*_*teu 19

我们使用了除上述之外的其他方式.因为这是一个卸载,我们可以杀死应用程序并取消它.最简单的方法,当你无法使用AppMutex :(与真正杀死Windows中的进程有关)

[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
Run Code Online (Sandbox Code Playgroud)

希望有人会帮助这个.我搜索了很长时间.

  • `taskkill` 是否会杀死同一进程的多个正在运行的实例? (2认同)
  • 谢谢!是的,它会杀死所有实例,除非您以低于进程提升的权限运行安装程序.[反正+ + 1 :)] (2认同)
  • 似乎终止了该进程,但卸载程序仍将文件视为已锁定并且不会删除它们。 (2认同)

sky*_*dev 7

尝试此解决方案!关于应用程序的其他解决方案我遇到了问题,但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;
Run Code Online (Sandbox Code Playgroud)

这个解决方案原始来源的主要道具.

  • 这很好,我改变的一件事是使用不同的过程而不是"函数InitializeUninstall():Boolean;" 由于即使用户取消卸载过程,此函数也会终止应用程序,而"procedure InitializeUninstallProgressForm;" 只有在他确认卸载时才会运行. (2认同)

Mar*_*ryl 6

在应用程序运行时,使用该AppMutex指令可防止卸载程序继续运行.

[Setup]
AppMutex=MyProgMutex
Run Code Online (Sandbox Code Playgroud)

应用程序必须创建指令指定的互斥锁.有关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;
Run Code Online (Sandbox Code Playgroud)

AppMutex上面的指令一样,应用程序必须创建CheckForMutexes调用中指定的互斥锁.


请注意,对于安装程序,您不必对此进行编码.安装程序内置了重启管理器.
请参阅Inno Setup中使用"taskkill/f/im"(重新)安装之前的Kill进程.