Inno Setup 在卸载过程中无法删除组件,因为我的程序仍在运行并且无法删除可执行文件。在允许卸载继续之前,我如何让它检查它是否正在运行?
4 回答
我们使用了上述以外的其他方式。因为这是一个卸载,我们可以杀死应用程序并卸载它。最简单的方法,当你不能使用 AppMutex 时:(与真正杀死 Windows 中的进程有关)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
希望有人会帮助这个。我为此搜索了很长时间。
检查这些
Inno Setup:使用 AppMutex 检测在任何用户会话中运行的实例
有几种方法。如果您的程序定义了互斥锁使用
[Setup]
AppMutex=MyMutexName
Code
或对于该部分中的指定互斥锁
function CheckForMutexes (Mutexes: String): Boolean;
你也可以使用
function FindWindowByClassName (const ClassName: String): Longint;
通过类名获取窗口句柄并向其发送消息。
或按名称获取
function FindWindowByWindowName (const WindowName: String): Longint;
或者您为此特定用例使用多个 DLL 文件之一
或者阅读后自己做
How To Enumerate Applications Using Win32 APIs(这个链接到德文版,因为某种原因我找不到英文版的 KB175030
或尝试 KB175030-DE 的谷歌翻译版本
试试这个解决方案!我在关闭应用程序时遇到了其他解决方案的问题,但 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;
此解决方案的原始来源的主要道具。
当应用程序运行时,使用该AppMutex
指令阻止卸载程序继续进行。
[Setup]
AppMutex=MyProgMutex
应用程序必须创建指令指定的互斥锁。有关示例,请参阅链接的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;
与AppMutex
上面的指令一样,应用程序必须创建CheckForMutexes
调用中指定的互斥锁。
请注意,对于安装程序,您不必对此进行编码。安装程序内置了重新启动管理器。
请参阅Inno Setup 中使用“taskkill /f /im”在(重新)安装之前终止进程。