Inno Setup打包的软件安装、卸载前检测进程运行情况并关闭相应进程

需求:

使用Inno Setup打包软件,要求安装和卸载时检查程序是否正在运行,如正在运行则关闭相应进程,不然会安装失败或者卸载不完全。

思路:
  1. 在Inno打包脚本中,编写[Code]模块,调用cmd,执行windows命令终止进程(我选用的方法);
    参考:Inno Setup安装卸载时检查程序是否运行提示并中止程序
  2. 使用psvince.dll、ISTask.dll实现(未测试);
    参考:Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程
  3. 尝试在安装和启动时调用bat文件,编写bat脚本文件实现检测并终止进程,也是一种看起来可行的思路(未测试);
    参考:Inno Setup 系列之安装、卸载时调用bat

转载:Inno Setup安装卸载时检查程序是否运行提示并中止程序

Inno Setup打包的软件需要在安装和卸载时检查程序是否在运行,不然会安装失败或者卸载不完全,网上搜了一下,有几种方法:

  1. 自己封装DLL,或者下载别人写好的DLL,比如psvince.dll和ISTask.dll,判断程序是否运行然后中止(有人说调用很慢很卡,没验证,因为自己没下载这两个DLL,自己写觉得麻烦)
  2. 通过FindWindowByWindowName之类的函数查找窗口,然后发送消息,通知程序退出(窗口名不固定就很麻烦,还有查找不到的)
  3. 通过调用命令行,执行windwow命令,达到检查和中止的功能(调用cmd命令会被一些杀毒软件阻止,需要手动允许)
  4. 通过在程序中添加命名mutex,然后在iss脚本中通过CheckForMutexes等函数判断程序是否运行

我使用的是第3种方法
在iss脚本的[Code]段添加如下代码,自己替换 “你的软件名.exe” 成你要检查的exe名称

[Code]
// 自定义函数,判断软件是否运行,参数为需要判断的软件的exe名称
function KDetectSoft(strExeName: String): Boolean;
// 变量定义
var ErrorCode: Integer;
var bRes: Boolean;
var strFileContent: AnsiString;
var strTmpPath: String;  // 临时目录
var strTmpFile: String;  // 临时文件,保存查找软件数据结果
var strCmdFind: String;  // 查找软件命令
var strCmdKill: String;  // 终止软件命令
begin
  strTmpPath := GetTempDir();
  strTmpFile := Format('%sfindSoftRes.txt', [strTmpPath]);
  strCmdFind := Format('/c tasklist /nh|find /c /i "%s" > "%s"', [strExeName, strTmpFile]);
  strCmdKill := Format('/c taskkill /f /t /im %s', [strExeName]);
  //ShellExec('open', ExpandConstant('{cmd}'), '/c taskkill /f /t /im 你的软件名.exe', '', SW_HIDE, ewNoWait, ErrorCode);
  //bRes := ShellExec('open', ExpandConstant('{cmd}'), '/c tasklist /nh|find /c /i "你的软件名.exe" > 0.txt', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
  bRes := ShellExec('open', ExpandConstant('{cmd}'), strCmdFind, '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
  if bRes then begin
      bRes := LoadStringFromFile(strTmpFile, strFileContent);
      strFileContent := Trim(strFileContent);
      if bRes then begin
         if StrToInt(strFileContent) > 0 then begin
            if MsgBox(ExpandConstant('{cm:checkSoftTip}'), mbConfirmation, MB_OKCANCEL) = IDOK then begin
             // 终止程序
             ShellExec('open', ExpandConstant('{cmd}'), strCmdKill, '', SW_HIDE, ewNoWait, ErrorCode);
             Result:= true;// 继续安装
            end else begin
             Result:= false;// 安装程序退出
             Exit;
            end;
         end else begin
            //MsgBox('软件没在运行', mbInformation, MB_OK);
            Result:= true;
            Exit;
         end;
      end;
  end;
  Result :=true;
end;

// 开始页下一步时判断软件是否运行
function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if 1=CurPageID then begin
      Result := KDetectSoft('你的软件名.exe');
      Exit;
  end; 
  Result:= true;
end;

// 卸载时关闭软件
function InitializeUninstall(): Boolean;
begin
  Result := KDetectSoft('你的软件名.exe');
end;

脚本是支持中英文安装包,所以还要添加[CustomMessages]段

// 自定义不同语言文本
[CustomMessages]
english.checkSoftTip=Setup detects that the software to be installed is running!%n%nClick "ok" to continue the operation after terminating the software, otherwise click "cancel" .
chinesesimp.checkSoftTip=安装程序检测到将安装的软件正在运行!%n%n点击"确定"终止软件后继续操作,否则点击"取消"。

如果不用支持中英文,可以把上面函数里的ExpandConstant(’{cm:checkSoftTip}’)直接改成你要显示的提示

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值