Inno Setup安装包制作

Inno Setup与NSIS有异曲同工之妙,且拥有更加简明的语法,其基于Delphi的扩展开发语法也更加友好。

花些时间简单了解一下,作为技术储备不深入研究,实际工作中主打NSIS。

实际案例:打包AutoCAD插件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
; 设置全局宏
#define MyAppName "XXX工具箱"
#define MyAppVersion "1.0.0.1"
#define MyAppPublisher "XXX公司"

; 设置注册表相关的全局宏
#define MAINDLL2021 "Toolkit_2021.dll"
#define MAINDLL2022 "Toolkit_2022.dll"
#define regACAD2021 "SOFTWARE\Autodesk\AutoCAD\R24.0\ACAD-4101:804"
#define regACAD2022 "SOFTWARE\Autodesk\AutoCAD\R24.1\ACAD-5101:804"

[Setup]
; 软件独一无二的ID
AppId={{2ADB07D1-D7E2-42EC-92EE-A6868ED21060}
; 软件名称
AppName={#MyAppName}
; 软件版本
AppVersion={#MyAppVersion}
; 安装包名称(不包含后缀名)
OutputBaseFilename={#MyAppName}{#MyAppVersion}
; 软件发布者
AppPublisher={#MyAppPublisher}
; 默认安装文件夹
DefaultDirName={autopf}\{#MyAppPublisher}\{#MyAppName}
; 启动菜单中所属文件夹
DefaultGroupName={#MyAppName}
; 设置是否允许用户不创建开始菜单
AllowNoIcons=no
; 设置压缩算法
Compression=lzma
SolidCompression=yes
; 设置只能在64位操作系统上运行
ArchitecturesAllowed=x64
; 设置安装路径在Program Files/
ArchitecturesInstallIn64BitMode=x64

; 设置安装界面的样式
WizardStyle=modern
; 设置安装界面的尺寸是否可调整
WizardResizable=no
; 设置安装界面尺寸缩放
WizardSizePercent=100
; 是否取消安装程序的欢迎界面
DisableWelcomePage=no
; 设置授权说明文件,注意该txt文件应该设置为Unicode BOM格式
LicenseFile=license.txt

; 防止通知打开多个安装进程
SetupMutex=SetupMutex{#SetupSetting("AppId")}

[Messages]
; 同时打开多个安装进程时的提示
SetupAppRunningError=安装程序正在执行中,不能同时执行多个!

; 多语言设置,每一行代表可选的一种语言
[Languages]
Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl"
; Name: "en"; MessagesFile: "compiler:Default.isl"
; Name: "Japanese"; MessagesFile: "compiler:Languages\Japanese.isl"

; 安装文件到目标路径
[Files]
; 将Release下的所有文件和文件夹拷贝到安装路径,排除所有的pdb文件
Source: "D:\PROJECTS\安装包制作\Toolkit\Release\*"; Excludes: "*.pdb"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; 图标设置
[Icons]
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"

; 设置注册表
[Registry]
Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: string; ValueName: "DESCRIPTION"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}'))
Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: string; ValueName: "LOADER"; ValueData: "{app}\{#MAINDLL2021}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}'))
Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "LOADCTRLS"; ValueData: 0x2; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}'))
Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "MANAGED"; ValueData: 0x1; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}'))

Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: string; ValueName: "DESCRIPTION"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}'))
Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: string; ValueName: "LOADER"; ValueData: "{app}\{#MAINDLL2022}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}'))
Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "LOADCTRLS"; ValueData: 0x2; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}'))
Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "MANAGED"; ValueData: 0x1; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}'))

[dirs]
; 设置文件夹权限为对所有用户完全开放权限
Name: "{app}"; Permissions: everyone-full

; 设置卸载时要删除的文件
[UninstallDelete]
Type: filesandordirs; Name:"{app}"

[Code]
; 检测是否存在某个版本的AutoCAD,借助注册表
function ExistsAutoCAD(const Name:string): Boolean;
var
Res: String;
begin
Result := RegQueryStringValue(HKEY_LOCAL_MACHINE, Name,'AcadLocation', Res)
end;

关键点总结

  • 压缩方式:和NSIS一样可以设置
  • 注册表操作(读、写、删):读需要借助Delphi脚本实现,相比NSIS稍麻烦些
  • 禁止启动多个安装进程:在这方面,Inno Setup有内置的控制参数,很方便
  • 用户权限设置:在这方面,Inno Setup有内置的控制参数,很方便
  • 读写xml文件:使用Delphi脚本实现,没有NSIS的插件方便

评论