zoukankan      html  css  js  c++  java
  • Inno Setup安装卸载时检查程序是否运行提示并中止程序

    https://blog.csdn.net/chenjk10/article/details/87189483

    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}')直接改成你要显示的提示

    ; 自定义不同语言文本
    [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点击"确定"终止软件后继续操作,否则点击"取消"。

  • 相关阅读:
    <转>修正版 疯狂代码 写给WEB2.0的站长
    一组MSSQL千万数量级分页存储过程
    flash AS +xml 加载图片(使用MovieClipLoader实现LOADING)
    [转]优化SQL Server的内存占用之执行缓存
    日志记录组件[Log4net]详细介绍(转)
    IBatis.Net如何支持多个数据库 [转帖]
    c#导入导出EXCEL
    弄了个新blogs 欢迎捧场
    ActionSrcipt 资源
    一个鼠标拖出一个圆形的简单demo
  • 原文地址:https://www.cnblogs.com/xiang--liu/p/12327977.html
Copyright © 2011-2022 走看看