25

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

4

4 回答 4

25

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

[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"

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

于 2014-05-21T13:35:20.183 回答
24

检查这些

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

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

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

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

[Setup]
AppMutex=MyMutexName

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

function CheckForMutexes (Mutexes: String): Boolean;

你也可以使用

function FindWindowByClassName (const ClassName: String): Longint; 

通过类名获取窗口句柄并向其发送消息。

或按名称获取

function FindWindowByWindowName (const WindowName: String): Longint;

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

或者阅读后自己做

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

How To Enumerate Applications Using Win32 APIs(这个链接到德文版,因为某种原因我找不到英文版的 KB175030

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

KB175030 德文 -> 英文

于 2009-10-16T09:41:53.950 回答
11

试试这个解决方案!我在关闭应用程序时遇到了其他解决方案的问题,但 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;

此解决方案的原始来源的主要道具。

于 2014-11-20T17:25:59.410 回答
9

当应用程序运行时,使用该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”在(重新)安装之前终止进程

于 2016-09-23T06:05:10.353 回答