使用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还有很多功能,可以自定义更好看的安装界面,如果你的软件需要其他环境依赖的,还可以在安装前检测本地环境是否符合,然后安装的依赖。