Inno安装程序在卸载期间无法删除组件导致我的程序仍在运行且无法删除可执行文件。在允许卸载之前,如何检查它是否正在运行?
答案 0 :(得分:22)
检查这些
Inno Setup: Detect instances running in any user session with AppMutex
Inno Setup: Is application running?
Inno Setup: Detect if an application is running
有几种方法。如果您的程序定义了互斥锁,请使用
[Setup]
AppMutex=MyMutexName
或Code
部分中指定的互斥锁
function CheckForMutexes (Mutexes: String): Boolean;
您也可以使用
function FindWindowByClassName (const ClassName: String): Longint;
按类名获取窗口句柄并发送消息。
或者通过名称获取
function FindWindowByWindowName (const WindowName: String): Longint;
或者您为此特定用例使用多个DLL文件之一
或者在阅读后自己动手
How To Terminate an Application "Cleanly" in Win32
How To Enumerate Applications Using Win32 APIs(这个链接到德语版本因为某些原因我找不到KB175030的英文版
或尝试使用google翻译版本的KB175030-DE
答案 1 :(得分:19)
我们使用了除上述之外的其他方式。因为这是一个卸载,我们可以杀死应用程序并取消它。 最简单的方法,当你无法使用AppMutex时:(与Really killing a process in Windows相关)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
希望有人能帮到你。我搜索了很长时间。
答案 2 :(得分: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;
答案 3 :(得分:5)
在应用程序运行时,使用AppMutex
directive阻止卸载程序继续运行。
[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
调用中指定的互斥锁。
请注意,对于安装程序,您不必对此进行编码。安装程序内置了重启管理器 请参阅Kill process before (re)install using "taskkill /f /im" in Inno Setup。