Inno setup 如何在程序运行时卸载程序,并且只有在用户确认关闭并卸载程序后才能卸载程序-Inno安装程序

Inno setup 如何在程序运行时卸载程序,并且只有在用户确认关闭并卸载程序后才能卸载程序-Inno安装程序,inno-setup,uninstallation,Inno Setup,Uninstallation,嘿,当我的程序在Windows中运行时,我需要使用Inno安装程序卸载它 我希望我的卸载程序能够检测它是否正在运行,并向运行Windows 10登录后台转换器的用户发送一个消息框。是否要关闭它并卸载 上述消息框应有两个按钮“是”和“否” 当此消息框出现在用户选择卸载后,即使它正在运行,当用户在消息框中选择“否”时,卸载程序应关闭 如果用户在该消息框中选择“是”,则卸载程序应终止正在运行的程序进程,并通常不静默地卸载它 我写了一个这样做的代码,但它失败了,并且给出了错误的行为 我的代码是: 函数I

嘿,当我的程序在Windows中运行时,我需要使用Inno安装程序卸载它

我希望我的卸载程序能够检测它是否正在运行,并向运行Windows 10登录后台转换器的用户发送一个消息框。是否要关闭它并卸载

上述消息框应有两个按钮“是”和“否”

当此消息框出现在用户选择卸载后,即使它正在运行,当用户在消息框中选择“否”时,卸载程序应关闭

如果用户在该消息框中选择“是”,则卸载程序应终止正在运行的程序进程,并通常不静默地卸载它

我写了一个这样做的代码,但它失败了,并且给出了错误的行为

我的代码是:

函数IsProcessRunningconst文件名:字符串:布尔值; 变量 FWMIService:变体; FSWbemLocator:变体; FWbemObjectSet:变量; 开始 结果:=假; FSWbemLocator:=CreateOleObject'WBEMScripting.SWBEMLocator'; FWMIService:=FSWbemLocator.ConnectServer,'root\CIMV2'; FWbemObjectSet:=FWMIService.ExecQueryFormat‘从Win32_进程中选择名称,其中名称=%s’,[FileName]; 结果:=FWbemObjectSet.Count>0; FWbemObjectSet:=未分配; FWMIService:=未分配; FSWbemLocator:=未分配; 终止 函数初始化安装:布尔值; var错误代码:整数; 开始 结果:=未运行“W10logbcr.exe”的isprocess; 如果没有结果的话 Msgbox“Windows 10登录后台转换器正在运行。是否要自动关闭并卸载它?”,mbError,MB_YESNO; 如果Msgbox的“Windows 10登录后台转换器正在运行。是否要自动关闭并卸载?”,mbError,MB_YESNO=IDNO,然后退出; 如果Msgbox的“Windows 10登录后台转换器正在运行。是否要自动关闭并卸载它?”,mbError,MB_YESNO=idies,然后开始 ShellExec'open','taskkill.exe','/f/im W10logbcr.exe',SW_HIDE,ewNoWait,ErrorCode; ShellExec'open'、'tskill.exe'、'Windows10登录背景更改器'、SW_HIDE、ewNoWait、错误代码; 结果:=真; 终止 终止 我怎样才能更正那个超级错误的代码

提前感谢。

函数IsProcessRunningconst AppName:string:Boolean; 变量 WMIService:变体; WbemLocator:变体; WbemObjectSet:变量; 开始 WbemLocator:=CreateOleObject'WbemScripting.SWbemLocator'; WMIService:=WbemLocator.ConnectServer'localhost','root\CIMV2'; WbemObjectSet:= WMIService.ExecQuery“从Win32_进程中选择*,其中Name=”+AppName+”; 结果:=不可变llwbemObjectSet和WbemObjectSet。计数>0; 终止 常数 ExeName='W10logbcr.exe'; 函数初始化安装:布尔值; 变量 错误代码:整数; 开始 如果是IsProcessRunningExeName,则 开始 如果MsgBox “Windows 10登录后台更改程序正在运行。”+ '是否要自动关闭并卸载?', 我错了,那就没田园风光了 开始 结果:=假; 出口 终止 其他的 开始 ShellExec 'open'、'taskkill.exe'、'/f/im'+ExeName、SW_HIDE、ewNoWait、ErrorCode; 终止 终止 结果:=真; 终止 请注意,我已经删除了tskill.exe,因为我认为这与现在无关。它只在家庭版的WindowsXP上需要,甚至在旧版的Windows上也需要。事实上,它在Windows10上已经不可用了


还请注意,我已将您的iProcessRunning替换为一个更好的。

谢谢,但是您在哪里找到了=idies,然后继续通过终止进程来卸载?我的意思是如果用户按Yes?很抱歉,如果你在回答问题的代码中以另一种方式找到了它,这是隐式的。如果用户按“否”,则进入退出分支。如果用户按下其他任何键,执行将跳过退出分支并继续执行ShellExec。无论如何,我已经添加了一个else分支,因此它更加明显。但这是多余的。我还将条件从=IDNO改为IDYES。这样更安全,不客气。虽然我们在一起。