有关 Inno Setup 的实践:检查并安装依赖,运行时退出安装或卸载

这篇具有很好参考价值的文章主要介绍了有关 Inno Setup 的实践:检查并安装依赖,运行时退出安装或卸载。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如题,检测 Microsoft Visual C++ 2015 Redistributable (x64) 依赖并安装,若程序安装或卸载时应用运行中将检测并退出文章来源地址https://www.toymoban.com/news/detail-821324.html

所需依赖

  • Microsoft Visual C++ 2015 Redistributable (x64) Microsoft 官网下载
  • psvince.dll Github 下载

编辑 iss 文件

[Files]
...
Source: "psvince_path\psvince.dll"; DestDir: "{app}"

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent; BeforeInstall: IsAllDependciesInstalled

[Code]
// 通过注册表检测 VC2015+ 是否安装
function IsVCServiceInstalled(): Boolean;
var
  Names: TArrayOfString;
  I: Integer;
  RootKey: Integer;
  Subkey: String; 
begin
  Result := false;
  if IsWin64 then
  begin
    RootKey := HKLM64;
  end
  else
  begin
    RootKey := HKLM32;
  end;
  if RegGetSubKeyNames(RootKey, 'SOFTWARE\Classes\Installer\Dependencies', Names) then
  begin
    for I := 0 to GetArrayLength(Names)-1 do
    begin
      SubKey := Names[I];
      if Pos('VC,redist.x64,amd64,14', Subkey) > 0 then
        begin
          Result := true;  
          Break;
        end
      else
        begin
          Result := false;
        end
    end
  end
end;

// 退出安装程序
procedure ExitProcess(uExitCode: Integer);
  external 'ExitProcess@kernel32.dll stdcall';

// 通过注册表判断所需服务是否安装
procedure IsAllDependciesInstalled;
var
  VCServiceInstalled: Boolean;
  MissingService: String;
  ResultCode: Integer;
begin
  MissingService := '';
  VCServiceInstalled := IsVCServiceInstalled();
  if not VCServiceInstalled then
    MissingService := MissingService + ExpandConstant('{#StringChange(VCServiceName, '&', '&&')}') + #13#10; // #13#10 代表换行

  if not VCServiceInstalled then
  begin
    if MsgBox(FmtMessage(CustomMessage('MissingDependcies'), [MissingService]), mbConfirmation, MB_OKCANCEL) = IDOK then
    begin
      if not VCServiceInstalled then
        Exec(ExpandConstant('{app}\{#VCServiceExeName}'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
        // 如果是 .msi 形式安装
        // ShellExec('', 'msiexec.exe', ExpandConstant('/I "{app}\{#VCServiceExeName}" /qb'), '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    end 
  end
end;

// 检测程序进程是否启动
function IsModuleLoaded2(modulename: String ):  Boolean;
external 'IsModuleLoaded2@files:psvince.dll stdcall setuponly';

// 判断进程是否存在
function IsAppRunning(const FileName : string): Boolean;
var
    FSWbemLocator: Variant;
    FWMIService   : Variant;
    FWbemObjectSet: Variant;
begin
    Result := false;
    try
      FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
      FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
      FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
      Result := (FWbemObjectSet.Count > 0);
      FWbemObjectSet := Unassigned;
      FWMIService := Unassigned;
      FSWbemLocator := Unassigned;
    except
      if (IsModuleLoaded2(FileName)) then
        begin
          Result := false;
        end
      else
        begin
          Result := true;
        end
      end;
end;

// 通过名称终结进程
procedure TaskKillProcessByName(AppName: String);
var
  WbemLocator : Variant;
  WMIService   : Variant;
  WbemObjectSet: Variant;
  WbemObject   : Variant;
begin;
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WMIService := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WMIService.ExecQuery('SELECT * FROM Win32_Process Where Name="' + AppName + '"');
  if not VarIsNull(WbemObjectSet) and (WbemObjectSet.Count > 0) then
  begin
    WbemObject := WbemObjectSet.ItemIndex(0);
    if not VarIsNull(WbemObject) then
    begin
      WbemObject.Terminate();
      WbemObject := Unassigned;
    end;
  end;
end;

// 安装的时候判断进程是否存在
function InitializeSetup(): Boolean;
begin
 Result := IsAppRunning('{#MyAppExeName}');
  if Result then
  begin
    MsgBox(ExpandConstant('{cm:SetupAppRunningError,{#StringChange(MyAppName, '&', '&&')}}'), mbError, MB_OK); 
    result:=false;
  end
else
    begin
      result := true;
    end;
end;

//;卸载的时候判断进程是否存在
function InitializeUninstall(): Boolean;
begin
 Result := IsAppRunning('{#MyAppExeName}');
  if Result then
  begin
    MsgBox(ExpandConstant('{cm:UninstallAppRunningError,{#StringChange(MyAppName, '&', '&&')}}'), mbError, MB_OK); 
    result:=false;
  end
else
    begin
      result := true;
    end;
end;  





到了这里,关于有关 Inno Setup 的实践:检查并安装依赖,运行时退出安装或卸载的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 将Python打包为exe+inno setup将exe程序封装成向导安装程序

    将Python打包为exe+inno setup将exe程序封装成向导安装程序

    为什么要打包? Python脚本不能在没有安装Python的机器上运行。如果写了一个脚本,想分享给其他人使用,可她电脑又没有装Python。如果将脚本打包成exe文件,即使她的电脑上没有安装Python解释器,这个exe程序也能在上面运行。 1、在pycharm中安装pyinstaller 2、进入你所在的文件

    2024年01月25日
    浏览(7)
  • Inno Setup打包教程(将已经打包为exe文件的java项目程序,打包为可安装的Windows程序以及最新版inno中文汉化)

    Inno Setup打包教程(将已经打包为exe文件的java项目程序,打包为可安装的Windows程序以及最新版inno中文汉化)

    提示:将已经打包为exe文件的java项目程序,打包为可安装的程序 文章目录 文章目录 一、Inno Setup是什么? 二、安装教程 1.下载安装 2.Inno Setup的简单使用和打包教程 3.Inno Setup的汉化 总结 Inno Setup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,现在已经更新

    2024年02月13日
    浏览(11)
  • Inno Setup简介

    Inno Setup简介

    简易打包: 选择使用向导创建一个新的脚本 填好图中的安装包名称、安装版本、安装包发布者、安装包的相关网站,安装包名称和版本是必填的,剩下那两个可以选填。 第一个是应用程序目标基本文件夹可以选择,第二个是应用程序文件夹名称,就是安装时新建的安装目录

    2024年02月09日
    浏览(13)
  • Inno Setup打包winform、wpf程序可判断VC++和.net环境

    Inno Setup打包winform、wpf程序可判断VC++和.net环境

    官网链接: link 1、新建打包文件 2、填写 应用名称、版本号、公司名称、公司官网 3、选择安装路径 Custom是指定默认路径、Program Files folder是默认C盘根目录 4、选择程序启动exe文件 以及Addfolder选择全部运行文件 5、选择安装前显示文字 、安装中、安装后 这里我只选择了安装前

    2024年02月16日
    浏览(7)
  • Inno Setup 结合exe4j打包 Java 程序为 EXE 文件

    Inno Setup 结合exe4j打包 Java 程序为 EXE 文件

    链接:https://pan.baidu.com/s/1l6qYRi6unjLL_4VVYpsShg 提取码:bzd6 文件内容: exe4j 是一个商业软件,旨在将 Java 程序打包为本地可执行文件。它提供了丰富的功能,包括创建 Windows 可执行文件、安装程序、服务等。使用 exe4j,您可以将 Java 应用程序打包成一个独立的 EXE 文件,无需安

    2024年02月09日
    浏览(13)
  • stable diffusion 运行(setup.py安装?直接运行?)

    在我python虚拟环境有所有包的情况下,我不需要用setup.py把这个ldm库安装到我的python虚拟环境,秩序要直接运行scripts/txt2img.py即可 有三种方法 1、直接把txt2img.py从scripts目录移动到根目录,然后运行即可 2、不用移动,但不能直接使用 python scripts/txt2img.py ,因为这个命令把txt

    2024年02月16日
    浏览(6)
  • npm i 安装的依赖项目,运行正常,换成pnpm i安装的依赖运行报错

    npm i 安装的依赖项目,运行正常,换成pnpm i安装的依赖运行报错

    报错信息大概如下   Failed to compile with 15 errors 00:47:21 These dependencies were not found: * codemirror/addon/dialog/dialog.css in ./node_modules/.pnpm/cache-loader@4.1.0_webpack@4.47.0/node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/.pnpm/babel-loader@8.3.0_@babel+core@7.23.2_webpack@4.47.0/node_modules/babel-loader/lib!./node_

    2024年02月08日
    浏览(12)
  • 有关钱包相关开发的库和依赖

    Trezor 钱包 GitHub 组织:https://github.com/trezor 说明:Trezor 是一款硬件加密货币钱包,它的团队开发了与助记词相关的许多工具和库。 Electrum 钱包 GitHub 仓库:https://github.com/spesmilo/electrum 说明:Electrum 是一款比特币轻量级钱包,它的团队也开发了与助记词相关的工具和库。 BIP4

    2024年04月29日
    浏览(8)
  • PNPM 批量检查和更新项目依赖

    PNPM 批量检查和更新项目依赖

    🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🌺 仓库主页: Gitee 💫 Github 💫 GitCode 💖 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请纠正! 前端项目的依赖管理是确保应用稳定运行和安全性的关键。随着依赖数量的增加和更新频率的加快

    2024年02月21日
    浏览(7)
  • 鸿蒙开发:OH编译构建分析 - 依赖关系检查

    背景 OHOS的编译构建系统是由sh脚本(或bat脚本),python脚本,Gn和Ninja工具组成的编译构建框架。总体编译构建流程是根据产品配置,生成具体依赖关系,然后使用Gn配置构建目标,通过Gn生成ninja文件,然后执行ninja生成二进制,最后打包生成镜像的过程。本篇主要涉及配置文

    2024年01月17日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包