Inno setup 卸载失败,因为程序正在运行。在尝试删除之前,如何对正在运行的进程进行Inno安装检查?

Inno setup 卸载失败,因为程序正在运行。在尝试删除之前,如何对正在运行的进程进行Inno安装检查?,inno-setup,Inno Setup,Inno安装程序在卸载过程中无法删除组件,因为我的程序仍在运行,无法删除可执行文件。在允许卸载继续之前,如何检查它是否正在运行 检查这些 有几种方法。如果您的程序定义了互斥锁,请使用 [Setup] AppMutex=MyMutexName 或用于code部分中指定的互斥锁 function CheckForMutexes (Mutexes: String): Boolean; 你也可以使用 function FindWindowByClassName (const ClassName

Inno安装程序在卸载过程中无法删除组件,因为我的程序仍在运行,无法删除可执行文件。在允许卸载继续之前,如何检查它是否正在运行

检查这些

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

[Setup]
AppMutex=MyMutexName
或用于
code
部分中指定的互斥锁

function CheckForMutexes (Mutexes: String): Boolean;
你也可以使用

function FindWindowByClassName (const ClassName: String): Longint; 
按类名获取窗口句柄并向其发送消息

或者叫它的名字

function FindWindowByWindowName (const WindowName: String): Longint;
或者,您可以将几个DLL文件中的一个用于此特定用例

或者在阅读后自己做

(由于某种原因,我找不到KB175030的英文版本,所以这一个链接到了德语版本。)

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


我们使用了与上述不同的方法。因为这是一种卸载,所以我们可以终止应用程序并将其卸载。 当你不能使用AppMutex时,最简单的方法是:(与相关)

[卸载运行]
文件名:“{cmd}”参数:“/C”“taskkill/im.exe/f/t”

希望有人能帮上忙。我为此搜索了很长时间。

尝试此解决方案!我在关闭应用程序时遇到了其他解决方案的问题,但Inno安装程序仍然认为已安装的文件被锁定

请记住定义常量:

#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;
应用程序运行时,使用的主要道具可阻止卸载程序继续进行

[Setup]
AppMutex=MyProgMutex
应用程序必须创建指令指定的互斥体。有关示例,请参阅链接的
AppMutex
指令文档


如果希望卸载程序在应用程序仍在运行时终止应用程序,请使用以下代码:

函数InitializeUninstall():布尔值;
变量
错误代码:整数;
开始
如果CheckForMutexes('MyProgMutex'),并且
(MsgBox('应用程序正在运行,是否要关闭它?',
MB确认,MB_ok取消)=IDOK)然后
开始
Exec('taskkill.exe','/f/im MyProg.exe','',SW_HIDE,
EWWAIT未过滤,错误代码);
结束;
结果:=真;
结束;
与上面的
AppMutex
指令一样,应用程序必须创建调用中指定的互斥


请注意,对于安装程序,您不必对此进行编码。安装程序内置了restart manager。

请参阅。

非常棒的答案。非常彻底;谢谢!全局互斥选项花了5分钟才正确!没有比这更好的了。对于可以在另一台计算机内存中打开的基于网络的文件,您有答案吗?我可以在Wayback机器上找到的最新英文版KB 175030是从2007年2月开始的:。更多选项用于在此答案处检查正在运行的应用程序的ons:“
taskkill
是否会杀死同一进程的多个正在运行的实例?使用notepad.exe进行了尝试,效果非常好。它将在没有反馈的情况下杀死应用程序。谢谢!是的,除非您以低于进程的权限运行安装程序,否则它会杀死所有实例。”levated。[+1ed:无论如何:)]似乎会终止进程,但卸载程序仍会将文件视为已锁定,不会将其删除。最好的解决方案是imo。这很好,我更改的一件事是使用不同的过程,而不是“function InitializeUninstall():Boolean;”因为即使用户取消卸载过程,此函数也会终止应用程序,而“过程初始化UninstallProgressForm;”仅在用户确认卸载后才会运行。
[Setup]
AppMutex=MyProgMutex