使用Inno Setup将QT开发的软件制作成安装包(仅Windwos平台)

news2024/9/20 16:59:59

使用Inno Setup将QT开发的软件制作成安装包(仅Windwos平台)

前言

在使用QT完成软件开发后要把软件给别人使用,我之前是打包发布后直接弄成压缩包发给别人,但是接收的人就要通过解压软件解压才能使用软件,如果没有解压软件还要安装一个,就会比较麻烦。后面使用Enigma Virtual Box将软件打包成一个.exe文件,但是对方安装了流氓杀毒软件,老是报毒把我的软件删掉,所以就想着直接整成安装包会不会稳妥一点,果然用安装包安装后基本没啥问题。下面我就将制作安装包的方法分享出来。

一、下载Inno Setup软件

官网:https://jrsoftware.org/
选择下载最新版本
在这里插入图片描述在这里插入图片描述
下载完后安装,一直Next就行了,可以改一下安装的路径。
安装完成后打开
在这里插入图片描述
如果要改成暗色主题和显示行号的话可根据以下操作:
在这里插入图片描述
在这里插入图片描述

二、Inno Setup创建安装包脚本

在菜单栏中选择 File -> New…
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装路径选择Program Files folder时,安装时候的默认路径就是一下两个文件夹,如果软件是64位的就推荐Program Files,32位就推荐Program Files (x86)
在这里插入图片描述
安装路径选择(Custom)时就可以自定义默认的安装路径
在这里插入图片描述
设置好后Next
在这里插入图片描述
选择了.exe文件后还要将其他文件添加进来,使用Add file(s)按钮添加文件,使用Add folder添加文件夹
以下是我的软件 windeployqt 打包发布后的目录,将除了.exe外的所有文件添加
在这里插入图片描述
在添加文件夹的时候还要进行以下操作:
在这里插入图片描述
在这里插入图片描述
如果不做这个操作,安装出来的就不会有文件夹,而是文件夹里的文件全部跑到根目录了
全部设置好后Next
这个是设置某些文件默认用你的软件打开,如果你的软件是什么编辑器的话就要设置,由于我的软件不是这类型的所以就不勾选了
在这里插入图片描述
在这里插入图片描述
这里可以都不选,如果是公司的软件可能有要求
在这里插入图片描述
在这里插入图片描述
选择安装时的语言,官方是默认没有简体中文的,需要下载中文依赖,不过github国内访问老是抽风
地址: https://github.com/kira-96/Inno-Setup-Chinese-Simplified-Translation
下载好后把ChineseSimplified.isl文件放在Inno Setup软件目录Language文件夹中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
是否马上编译脚本
在这里插入图片描述
是否在编译前保存脚本
在这里插入图片描述
保存脚本
在这里插入图片描述
保存后就开始编译了,会在刚才选的安装包路径中生成一个安装包,基本这个安装包就能够进行基本的安装了
在这里插入图片描述
在这里插入图片描述

三、优化

1. 安装包文件版权信息

在这里插入图片描述
在脚本中添加

AppCopyright={#MyAppPublisher}

在这里插入图片描述
再次编译后
在这里插入图片描述

2. 判断软件是否已在本地安装

使用安装包安装后会在本地注册表注册一些信息,我们可以通过这些信息判断是否安装过软件以及版本是升级还是下降
写在注册表的文件名称是通过AppId这个属性决定的,我们可以自定义AppId,只要保证和其它软件不重复就行
在这里插入图片描述
现在我们试下重新编译并且安装软件,然后查看注册表
win + R打开运行窗口
在这里插入图片描述
然后找到这个目录计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\找到软件注册信息
在这里插入图片描述
现在我们要做的就是判断注册表是否有这个文件,如果没有则没有安装软件,如果有则提示用户已经安装过了并且通过获取DisplayVersion属性与安装包中版本对比,判断是升级软件,还是版本相同不需要重复安装。
在脚本中添加[Code]部分,大概逻辑是先判断注册表中是否存在AppId,没有就直接继续安装,如果存在则取出本地的版本与安装包的版本对比,如果版本一样则提示不需要重复安装,安装包的更新则提示是否升级,安装包的版本更低则提示是否降级。不过这样的话就会导致不能存在多个版本的软件,所以要看业务需求是怎样的。

[Code]
function InitializeSetup(): Boolean;
  var
    m_sVersion: String;
    m_lCompareResult: Integer;
  begin
      if RegKeyExists(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#APPID}_is1') then
      begin
        RegQueryStringValue(HKLM, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#APPID}_is1', 'DisplayVersion', m_sVersion);
        m_lCompareResult := CompareStr('{#MyAppVersion}', m_sVersion);
        if m_lCompareResult < 0 then
        begin
           Result := MsgBox('检测到本地已安装 ' + m_sVersion + ' 版本,是否将软件版本降为 {#MyAppVersion}版本?', mbInformation, MB_YESNO) = IDYES;
        end
        else if m_lCompareResult = 0 then
        begin
           MsgBox('检测到本地已安装 ' + m_sVersion + ' 版本,无需再次安装。', mbInformation, MB_OK);
           Result := false;
        end
        else
        begin
           Result := MsgBox('检测到本地已安装 ' + m_sVersion + ' 版本,是否将软件版本升级为 {#MyAppVersion}版本?', mbInformation, MB_YESNO) = IDYES;
        end;
      end
      else
      begin
        Result := true;
      end;
  end;

这里用到了很多Inno Setup的api,想要深入了解的同志可以在以下网站中探索:
https://jrsoftware.org/ishelp/

四、参考资料

超棒小姐姐的Inno Setup教程 https://www.bilibili.com/video/BV15k4y1R7cL

结尾

Inno Setup还有很多功能,可以自定义更好看的安装界面,如果你的软件需要其他环境依赖的,还可以在安装前检测本地环境是否符合,然后安装的依赖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/467795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WizardKM:Empowering Large Language Models to Follow Complex Instructions

WizardKM:Empowering Large Language Models to Follow Complex Instructions Introduction参考 Introduction 作者表明当前nlp社区的指令数据比较单一&#xff0c;大部分都是总结、翻译的任务&#xff0c;但是在真实场景中&#xff0c;人们有各式各样的需求&#xff0c;这限制…

MyBats

一、MyBatis简介 1. MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c; iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到Github。 iBatis一词来…

【Python | 基础语法篇】02、标识符、运算符、字符串扩展及数据输入

目录 一、标识符 1.1 什么是标识符 1.2 标识符命名规则 1.2.1 标识符命名规则 - 内容限定 1.2.2 标识符命名规则 - 大小写敏感 1.2.3 标识符命名规则 - 不可使用关键字 1.3 案例演示 1.4 变量命名规范 1.4.1 变量命名规范 - 见名知意 ​1.4.2 变量命名规范 - 下划线…

Spring aop如何寻找advisor

1.bean的生命周期第一步回去解析所有的advisor 2.第四个是我们之前开启的注解EnableAspectJAutoProxy 3.org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessBeforeInstantiation 4.org.springframework.aop.framework.autoproxy.AbstractAutoP…

ChatGPT的提示的一些高级知识

作为一个大型语言模型(LLM)接口&#xff0c;ChatGPT有令人印象深刻的潜力&#xff0c;但是真正能否用好取决与我们的提示&#xff08;Prompt &#xff09;&#xff0c;一个好的提示可以让ChatGPT晋升到一个更好的层次。 在这篇文章中&#xff0c;我们将介绍关于提示的一些高级…

可视化 | Flask+Pyecharts可视化模板二

文章目录 &#x1f3f3;️‍&#x1f308; 1. 系统说明界面&#x1f3f3;️‍&#x1f308; 2. 柱状图示例界面&#x1f3f3;️‍&#x1f308; 3. 散点图示例界面&#x1f3f3;️‍&#x1f308; 4. 折线图示例界面&#x1f3f3;️‍&#x1f308; 5. 饼图示例界面&#x1f3f…

单链表——你需要掌握的那些内容

如有错误&#xff0c;感谢不吝赐教、交流 文章目录 前言本文涉及题目&#xff1a;设计链表有无头结点的区别头指针无头结点有头结点为什么需要头结点呢&#xff1f;注意&#xff1a; 单链表&#xff0c;本文使用Java实现定义链表节点定义一个链表类并初始化get(int index)addA…

HAproxy与web集群

文章目录 一、HAproxy1.HAProxy是什么2.HAProxy的核心能力和关键特性3.LVS、Nginx、HAproxy的区别&#xff1a; 二、实验步骤1.Haproxy搭建 Web 群集 总结 一、HAproxy 1.HAProxy是什么 HAProxy是一个免费的负载均衡软件&#xff0c;可以运行于大部分主流的Linux操作系统上。…

儿童生长发育迟缓的鉴别和干预

&#xff08;英国&#xff09;国家临床医学研究所&#xff08;NICE&#xff09;2017年发布关于婴儿/儿童生长发育迟缓的鉴别、评估和监测的指南&#xff0c;该指南确定了生长发育的界值&#xff0c;指出了诱因及危险因素&#xff0c;并提出了干预的方案。 ▼Part1&#xff1a;…

“无人值守”时代已来,千巡翼X4给出怎样的答案?

随着技术和产品的逐渐成熟&#xff0c;无人机在各行业的应用越来越普遍&#xff0c;但如何进一步解放人力&#xff0c;提高运营效率&#xff0c;还有很大的探索空间。针对作业频率高、重复性高、周期性强、作业环境艰险危险等痛点&#xff0c;用户迫切需要更高效、更智能的全自…

LeetCode876. 链表的中间结点

876. 链表的中间结点 描述示例解题思路以及代码解法1解法2 描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 示例1 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释…

希尔排序的实现

希尔排序是插入排序的一种升级&#xff0c;其基本思想是&#xff1a; 先选定一个整数&#xff0c;把待排序文件中所有记录分成个组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每 一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组和排序的工 作…

可执行Jar项目

一个复杂Jar的运行&#xff0c;要解决classpath问题&#xff0c;否则运行时会有ClassNotFoundException抛出。而用java&#xff0c;需要手动维护一个classpath文件&#xff0c;或者将所有的库位置放到命令行参数里。有没有更好的办法&#xff1f; Jar库目录方式 核心配置在于两…

算法训练Day40:343. 整数拆分 96.不同的二叉搜索树

文章目录 整数拆分题解&#xff08;动态规划&#xff09;贪心 不同的二叉搜索树题解 整数拆分 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (62.22%)11660--0 Tags 数学 | 动态规划 Companies 给定一个正整数 n &#xff0c;将其拆分为…

推荐几个免费的在线文本转语音网站(支持中英文多种语音)

如果你正在寻找一款免费的在线文本转语音工具&#xff0c;那么你来对地方了&#xff01;本文将介绍几个完全免费的在线文本转语音网站&#xff0c;推荐收藏下来以备不时之需。 No.1 免费文本转语音&#xff08;TTSMaker&#xff09; TTSMaker是第一个推荐的工具&#xff0c;这…

院内导航方案怎么样?什么地图可以用于医院导航系统?

什么地图可以用于医院导航系统&#xff1f;随着医疗事业的不断发展&#xff0c;医院的建制规模越来越大&#xff0c;在医疗能力得到增强的同时&#xff0c;由于楼宇众多&#xff0c;院内寻路难度难免增加。不少前来医院就诊的患者经常会有“寻路难”的困扰。此时一张一目了然的…

从在线监测与故障诊断系统视角,探讨动设备安全运行的重要性

在工业生产中&#xff0c;动设备是生产线的重要组成部分&#xff0c;但是随着设备运行时间的不断延长&#xff0c;设备的损耗逐渐加大&#xff0c;设备故障和损坏的风险也随之增加&#xff0c;给生产效率和安全带来不小的影响。因此&#xff0c;如何保证动设备的安全运行成为了…

更简单的存取Bean的方式(一)-五大类注解

目录 使用类注解 前置工作 Bean命名规则 五大类的实现 JavaEE标准分层 之前我们存储Bean时,是在spring-config.xml文件中添加bean注册内容来实现的 通过"注解"我们可以替代这一项工作 更加简单的存储方式: 使用类注解 五大类注解: Controller(控制器):用来控制…

常用的倾斜摄影三维模型3DTILES格式优缺点分析

常用的倾斜摄影三维模型3DTILES格式优缺点分析 三维模型3DTILES格式是一种用于描述三维模型和场景数据的标准格式&#xff0c;具有以下优点和缺点&#xff1a; 优点&#xff1a; 1、多平台支持&#xff1a;3DTILES格式基于WebGL和JavaScript技术&#xff0c;可以在多个平台上…

用Python搞定接口自动化测试:轻松实现RPC协议接口测试

每天进步一点点&#xff0c;关注我哦&#xff0c;每天分享测试技术文章&#xff0c;文末有福利&#xff01; 目录&#xff1a;导读 前言 一、什么是RPC 二、RPC框架 三、基于grpc框架服务的接口测试 01创建一个grpc服务接口 02调用grpc接口客户端 03接口框架中适配grpc封…