Inno Setup教程
ISS文件结构
//宏定义段
[Setup]
[Types]
[Components]
[Tasks]
[Dirs]
[Files]
[Icons]
[INI]
[Languages]
[Messages]
[CustomMessages]
[LangOptions]
[Registry]
[Run]
[UninstallDelete]
[UninstallRun]
[Code]
宏定义
一般再文件开头会添加一些宏定义,此处宏定义一般是为了后续脚本的复用
#define MyAppName "MyApp"
#define MyVersion "3.2.5.872"
#define MyAppVersion MyVersion + "_20240306#标准版"
#define MyAppRuntimeVersion "0.1.23_20230831"
#define MyAppPublisher "Publisher, Inc."
#define MyAppExeName "Server.exe"
#define MyAppAssocName MyAppName + " File"
#define MyAppAssocExt ""
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
#define BasePath "E:\部署环境\app\server"
#define CodeMeterRuntimeRegPath "SOFTWARE\WIBU-SYSTEMS\CodeMeter"
#define CodeMeterRuntimeRegValuePath "RuntimeVersion"
#define MSRuntimeRegPath "SOFTWARE\Classes\Applications\SoundIAppServer.exe\app"
#define MSRuntimeRegValuePath "MSRuntime"
#define MyCompany="xxxx科技有限公司"
#define MyProductName="AppServer"
#define MyAppCopyright="Copyright © 2024 xxx ALL rights reserved."
[Setup]
包含安装程序和卸载程序使用的全局设置
//每个安装程序的AppId都不同,用于区分不同的程序
AppId={{29ee33a2-d9a5-11c5-4ad5-3f40594274f5}
//应用程序名称
AppName={#MyAppName}
//应用程序版本
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
//默认安装路径,
DefaultDirName={autopf}\{#MyAppName}
//安装/卸载后刷新文件关联信息
ChangesAssociations=yes
//安装程序将不显示“选择开始菜单文件夹”向导页
DisableProgramGroupPage=yes
//安装包输出目录路径
OutputDir={#BasePath}\release\AppSetup_{#MyAppVersion}
//安装文件名称
OutputBaseFilename=AppV3ServerSetup_{#MyAppVersion}
//压缩算法,基于压缩率和压缩/解压缩速度权衡,推荐zip算法
Compression=zip
//是否启用固态压缩(将所有文件进行一次压缩,提升压缩率),默认no
SolidCompression=yes
//安装程序外观风格,默认classic
WizardStyle=modern
//以管理员权限安装
PrivilegesRequired=admin
//对于安装包大小大于2,100,000,000 bytesd(2GB)的情况下,需要开启该选项,将生成一个setup.exe以及多个bin文件,分片
DiskSpanning=yes
//安装包的图标
SetupIconFile=E:\部署环境\app\server\256.ico
//鼠标悬浮-文件版本
VersionInfoVersion={#MyVersion}
//鼠标悬浮-公司信息
VersionInfoCompany={#MyCompany}
//鼠标悬浮-程序版本
VersionInfoProductVersion={#MyVersion}
//鼠标悬浮-程序名称
VersionInfoProductName={#MyProductName}
//鼠标悬浮-版权
AppCopyright={#MyAppCopyright}
[Types]
定义了安装程序将显示在向导的选择组件页面上的所有安装类型,如下图所示,一般用于自定义安装,与[Components]段配合使用
[Types]
Name: "full"; Description: "完整安装所有组件"
Name: "onlyInstallClient"; Description: "仅安装客户端"
Name: "onlyInstallServer ";Description:"仅安装服务端";
Name: "custom ";Description:"自定义安装组件"; Flags: iscustom
Flags
iscustom
指示安装程序该类型是自定义类型。每当最终用户在安装过程中手动更改组件选择时,安装程序都会将安装类型设置为自定义类型。注意,如果不定义自定义类型,安装程序将只允许用户选择安装类型,他们不能再手动选择/取消选择组件。
效果展示
[Components]
定义了安装程序将显示在安装类型自定义向导的选择组件页面上的所有组件
[Components]
Name: "main"; Description: "系统运行的最小单元"; Types: full custom; Flags: fixed
Name: "main\client"; Description: "客户端"; Types: full onlyInstallClient custom; Flags: fixed
Name: "main\server"; Description: "服务端"; Types: full onlyInstallServer custom; Flags: fixed
Name: "tools"; Description: "维护系统的工具"; Types: full
Name: "tools\backups"; Description: "数据备份工具"; Types: full
Name: "tools\logsExport"; Description: "日志导出工具"; Types: full
效果展示
[Tasks]
安装程序在安装过程中将执行的所有用户可选任务
[Tasks]
Name: "resetDateDir"; Description: "重新选择数据存储目录"; GroupDescription: "修改配置信息:";
Name: "resetServerHost"; Description: "重新选择案件服务地址"; GroupDescription: "修改配置信息:";
Name: "autoBackupCases"; Description: "安装前自动备份案件数据"; GroupDescription: "案件数据:"; Components: tools\backups
Name: "autoRestoreCases"; Description: "安装后自动恢复案件数据"; GroupDescription: "案件数据:"; Components: tools\backups
Components
关联的组件,只有用户在上一步选择了该组件,这一步才会展示该任务。例如,用户在上一步没有选择“数据备份工具”,则不展示"安装前自动备份案件数据"及"安装后自动恢复案件数据"
Flags
exclusive
标志位表示与统计其他任务互斥,例如以下情况
[Tasks]
Name: "restart"; Description: "安装完成后自动重启电脑"; Flags:exclusive
Name: "autoOpenClient"; Description: "安装完成后自动打开客户端"; Flags:exclusive
[Dirs]
定义安装程序除了用户选择的应用程序目录(该目录是自动创建的)之外要创建的任何其他目录
[Dirs]
Name: "{app}\data"
Name: "{app}\bin"
Attribs
指定目录的其他属性。readonly,
hidden,
system,
notcontentindexed
Flags
deleteafterinstall
如果安装之前目录不存在,且安装完成(或中止)后目录为空,则在安装完成(或中止)后将其删除。
uninsalwaysuninstall
安装完成(或中止)后目录为空,则在安装完成(或中止)后将其删除。
uninsneveruninstall
卸载程序不删除目录。默认情况下,如果[ Dirs ]部分中指定的目录为空,卸载程序将删除该目录。
[Files]
安装程序要安装在用户系统上的文件。
[Files]
Source: "{#BasePath}\SoundIDorServer.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BasePath}\SoundIDorServerBase.xml"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: ChangeServerRunXmlConfig
Source: "{#BasePath}\dor-server.jar"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BasePath}\jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs
DestName
此参数指定文件在用户系统上安装时的新名称。默认情况下,安装程序使用 Source
参数中的名称,因此在大多数情况下不需要指定此参数。
Excludes
指定要排除的模式列表,以逗号分隔。此参数不能与 external
组合。
Source: "{#BasePath}\jre\*"; DestDir: "{app}\jre"; Excludes: "*.txt"; Flags: ignoreversion recursesubdirs createallsubdirs
Attribs
同[Dirs]段
Flags
confirmoverwrite
在替换现有文件之前,始终要求用户确认。
createallsubdirs
默认情况下编译器在递归搜索 Source 文件名/通配符(例如 jre\*)时会跳过空目录。这个标志会在安装时创建这些目录,必须与recursesubdirs
一起使用
deleteafterinstall
安装后删除,如果安装前文件存在,且未替换,则不删除,不能与isreadme
, regserver
, regtypelib
, restartreplace
, sharedfile
, uninsneveruninstall
一起使用
dontverifychecksum
安装程序在提取后,不验证文件校验和。对已编译到安装程序中但希望修改的文件使用此标志。与nocompression
一起使用
isreadme
文件是“ README”文件。安装中只有一个文件可以有这个标志。当一个文件有这个标志时,会出现一个选项,是否希望在安装完成后查看 README 文件。如果选择“是”,安装程序将打开该文件。对文件后缀有要求.txt, .wri, .doc
nocompression
不进行压缩
onlyifdoesntexist
只有当文件在用户系统上不存在时才安装该文件。
recursesubdirs
递归Source
指定的目录
replacesameversion
用户的系统中已经存在该文件,并且版本号相同时,并且文件内容不同时,才替换该文件。PS:默认行为情况下,不替换具有相同版本号的现有文件。
uninsneveruninstall
不删除文件
文件替换规则
如果一个文件已经存在于用户的系统中,默认情况下将根据以下规则替换该文件:
- 如果现有文件的版本比正在安装的文件旧(由文件的版本信息决定) ,那么现有文件将被替换。
- 如果现有文件的版本与正在安装的文件相同,则不会替换现有文件,除非使用了
replacesameversion
并且两个文件的内容不同。 - 如果现有文件是比正在安装的文件更新的版本,或者如果现有文件具有版本信息,但正在安装的文件没有,则不会替换现有文件。
- 如果现有文件没有版本信息,它将被替换。
如果安装程序无法替换现有文件,因为另一个进程正在使用该文件,则安装程序将多达4次尝试替换该文件,每次尝试前延迟一秒钟。如果所有尝试都失败,将显示一条错误消息。
[Icons]
定义了安装程序在开始菜单和/或其他位置(如桌面)中创建快捷方式。
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "E:\部署环境\dor\server\256.ico"
[INI]
定义希望安装程序在用户系统上设置的 .INI 文件条目。
[INI]
Filename: "SoundIDorServer.ini"; Section: "InstallSettings"; Key: "DateDir"; String:"{app}\data"
Filename: "SoundIDorServer.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{app}"
[Languages]
定义了安装程序可用的语言。
[Languages]
Name: "zh"; MessagesFile: "compiler:Languages\Chinese.isl"
[Messages]
定义由安装程序和卸载程序显示的消息。
[CustomMessages]
定义自定义消息值
[CustomMessages]
autoBackupCases=安装前自动备份案件数据
[Tasks]
Name: "autoBackupCases"; Description: "{cm:autoBackupCases}"; GroupDescription: "案件数据:"; Components: tools\backups
[Registry]
定义您希望安装程序在用户系统上创建、修改或删除的任何注册表项/值
[Registry]
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\dor"; ValueType: string; ValueName: "DataDir"; ValueData: "{code:SelectDataDir}"
Root
Root 注册表Root key HKCU
(HKEY_CURRENT_USER) HKLM
(HKEY_LOCAL_MACHINE) HKCR
(HKEY_CLASSES_ROOT) HKU
(HKEY_USERS) HKCC
(HKEY_CURRENT_CONFIG) HKA 在管理员权限运行时为HKLM,否则为HKCU
ValueType
ValueType 注册表 none
创建键,但不创建值 string
REG_SZ expandsz
REG_EXPAND_SZ multisz
REG_MULTI_SZ dword
REG_DWORD qword
REG_QWORD binary
REG_BINARY
Flags
deletekey
安装程序将首先尝试删除存在的整个键,包括其中的所有值和子键。如果 ValueType 不是 none,那么它将创建一个新的键和值。
deletevalue
安装程序将首先尝试删除存在的值。如果 ValueType 不是 none,那么它将创建键(如果它不存在)和新值。
dontcreatekey
安装程序将不会尝试创建用户系统上尚不存在的键或任何值。如果键不存在,则不显示错误消息。
noerror
不显示错误消息
uninsclearvalue
卸载程序时,将值的数据设置为空字符串(类型为 REG _ SZ)。此标志不能与 uninsdeltekey
标志组合。
uninsdeletekeyifempty
卸载程序时,如果键中没有值或子键,则删除该键。此标志可以与 uninsdeletevalue
组合使用。
uninsdeletevalue
卸载程序时删除该值。此标志可以与 uninsdeletekeyifempty
组合使用。
[Run]
安装过程中执行的操作,按照在脚本中出现的顺序执行。默认情况下,安装/卸载将等到程序终止后再继续下一个条目,
[Run]
Filename: "{app}\install.bat"; Description: "初始化系统环境"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden
Filename: "C:\Users\Public\asr\script\install.bat"; Description: "初始化ASR系统环境"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden
Filename: "{app}\switch.bat"; Description: "切换到标准版服务"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden
Parameters
程序的可选命令行参数
Filename: "{app}\前端安装包.exe"; Parameters: "dataDir {app}\app"
StatusMsg
在执行程序时向导上显示的消息
Filename: "{app}\前端安装包.exe"; Parameters: "dataDir {app}\app";StatusMsg: "正在安装客户端程序,请稍等..."
Flags
hidewizard
程序运行时将隐藏安装向导
nowait
不等待当前进程执行结束,直接执行下一个Run,不能与waituntilidle
,waituntilterminated
一起使用
postinstall
安装完成后,“安装完成”页面创建一个复选框,用户可以选择是否执行该Run。如果使用restartreplace
或者 AlwaysRestart
[Setup]
,安装完成后重启计算机,该选项将被忽略
unchecked
与postinstall
一起使用,不选中复选框
runascurrentuser
继承执行安装程序过程中的用户权限
runasoriginaluser
继承最初启动安装程序的用户权限
runhidden
隐藏窗口中执行
runmaximized
在最大化窗口中启动程序或文档
runminimized
在最小化窗口中启动程序或文档
shellexec
如果Filename不是可执行文件(.exe .com),使用该标志可以打开系统中的文件,等同于双击该文件。默认不等待该段执行完成,需要与waituntilterminated
配合使用
waituntilterminated
等待进程终止,与shellexec
配合使用
skipifnotsilent
安装程序非静默运行时跳过此项
skipifsilent
安装程序静默运行时跳过此项
[UninstallRun]
卸载时执行的程序,大部分参数与[Run]段相同
[Code]
编写Pascal 脚本实现功能,此处只在安装/卸载程序运作时生效
可以查阅该文档熟悉Pascal语法及特性
Install事件函数
InitializeSetup
function InitializeSetup(): Boolean;
在安装程序初始化期间调用。将 False 返回到中止安装程序,否则为 True。
示例代码
function InitializeSetup: Boolean;
var
ResultStr: String;
ResultCode: Integer;
regUnInstPath: String;
hasUninstall:boolean;
begin
if RegValueExists(HKLM64,regUnInstPath,'UninstallString') then
begin
case MsgBox('警告:【SoundIDorServer】应用程序正在运行。' #13#10 '请先卸载原有服务再进行安装,点击【是】则卸载原有服务,点击【否】则退出安装',mbInformation,MB_YESNO) of
IDYES:
begin
//xxxx
end;
IDNO:
begin
Result := false;
exit;
end;
end;
end;
result:=true;
end;
InitializeWizard
使用此事件函数可以在启动时对向导或向导页面进行更改
procedure InitializeWizard();
示例代码
procedure InitializeWizard;
var
RegDataDirPath ,DataDir :String;
begin
//创建一个选择数据存储目录的页面
DataDirPage:=CreateInputDirPage(
wpSelectDir,
'数据存储目录',
'任务数据会存储在选择的目录下, 请选择英文或数字路径!',
'例如:您选择了E:\ , 则默认在E:\下创建文件夹dor, 数据最终会存储在E:\dor目录下',
False,
'dor'
);
end;
DeinitializeSetup
在安装程序终止之前调用。即使用户在安装之前退出安装程序,也会调用此函数。
procedure DeinitializeSetup();
CurStepChanged
在安装前/安装后/安装完成是调用该函数
procedure CurStepChanged(CurStep: TSetupStep);
示例代码
procedure CurStepChanged(CurStep: TSetupStep);
var LogContext:string;
begin
case CurStep of
ssInstall:
begin
//在实际安装开始之前调用
end;
ssPostInstall:
begin
//在实际安装完成之后调用
end;
ssDone:
begin
//在安装成功后关闭之前调用
end;
end;
end;
CurInstallProgressChanged
在安装程序提取文件、创建快捷方式、创建 INI 项和创建注册表项时,可以使用此事件函数监视进度。
procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);
NextButtonClick
当用户单击 Next 按钮时调用。如果返回 True,向导将移动到下一页; 如果返回 False,向导将保留在当前页(CurPageID)。
function NextButtonClick(CurPageID: Integer): Boolean;
CurPageID支持以下值
wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished
BackButtonClick
当用户单击 Back 按钮时调用。如果返回 True,向导将移到上一页; 如果返回 False,向导将保留在当前页(CurPageID)。
function BackButtonClick(CurPageID: Integer): Boolean;
CancelButtonClick
当用户单击“取消”按钮或单击窗口的“关闭”按钮时调用。
//Cancel:指定是否应进行正常的取消处理,默认为true
//Confirm:指定是否弹出”是否确认退出“,默认为ture
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
ShouldSkipPage
向导调用此事件函数来确定是否应显示当前页面(CurPageID),返回Ture跳过当前页面
function ShouldSkipPage(PageID: Integer): Boolean;
示例代码
procedure ShouldSkipPage(PageID: Integer);
var LogContext:string;
begin
if minimum(PageID) then
begin
Result:=True;
end;
else
begin
Result:=False;
end;
end;
CurPageChanged
在显示当前页面( CurPageID )后调用。
procedure CurPageChanged(CurPageID: Integer);
CheckPassword
在输入密码后调用,返回False表示密码错误。PS:使用/PASSWORD参数进行安装时,该事件将在其他时间之前调用
function CheckPassword(Password: String): Boolean;
NeedRestart
返回 True 时,安装程序在成功安装结束时提示用户重新启动系统
function NeedRestart(): Boolean;
UpdateReadyMemo
TODO:
[与此页面有关](##Ready to Install),返回当前页面文本信息,
function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
Uninstall事件函数
InitializeUninstall
返回 False 终止卸载
function InitializeUninstall(): Boolean;
UninstallNeedRestart
返回 True 时, 卸载成功后提示用户重新启动系统,
function UninstallNeedRestart(): Boolean;
BeforeInstall and AfterInstall
-
除了[ Language ]、[ Type ]、[ Component ]和[ Tasks ]之外,其他段都支持该函数
-
定义的函数不能有返回值
-
如果安装程序已经确定不应该处理条目,则不会调用 BeforeInstall 或 AfterInstall 函数。
-
使用通配符的项,每个文件都会调用一次该函数
[Files] //会多次调用printFileName函数 Source: "{#BasePath}\dor-server.jar"; DestDir: "{app}"; Flags: ignoreversion;AfterInstall:printFileName('{app}\bin\java.exe') [Code] procedure printFileName(FileName: String); begin if FileName <> CurrentFileName then begin Log(FileName) end; end;
安装顺序
-
[Dir]
-
[Files]
-
[Icons]
-
[INI]
-
[Registry]
-
[Run](PS:对于使用Flags:postinstall的项需要特别注意)
向导页面
Welcome
欢迎页面,DisableWelcomePage=yes启用
License Agreement
用户协议页面,LicenseFile=license.txt启用
Password
输入密码的页面,Password=yes启用
Information**
自述文件页面,InfoBeforeFile=readme.txt启用
User Information
用户信息页面,UserInfoPage=yes启用
Select Destination Location
选择安装目录的页面,DisableDirPage=no禁用,auto时自动判断注册表内的值
Select Components
[Components]段定义的组件页面
Select Start Menu Folder
[Icon]段定义的快捷方式,此页面选择存放的目录
Select Tasks
[Tasks]段定义的任务项
Ready to Install
安装前的页面,DisableReadyPage=yes启用,
Preparing to Install
预安装页面
Installing
安装进度页面
Information
自述文件页面,安装完成后展示,InfoAfterFile=infoafter.txt启用
Setup Completed
安装完成页面
常量表
文件夹常量
常量名 | 含义 |
---|---|
{app} | 应用程序目录 |
{win} | 系统的 Windows 目录,C:\Windows |
{sys} | 系统的 System32目录,C:\Windows\System |
{sysnative} | 在64位 Windows 上,包含64位系统文件的目录。在32位 Windows 上,包含32位系统文件的目录。 |
{syswow64} | C:\Windows\SysWOW64 |
{src} | 安装包所在的目录 |
{sd} | 系统盘目录,一般是C: |
{commonpf} | 根据安装脚本的安装模式改变 |
{commonpf32} | 32位系统为C:\Program Files ,64位系统为 C:\Program Files (x86) |
{commonpf64} | C:\Program Files |
{tmp} | 安装程序或卸载程序使用的临时目录,安装或卸载退出时,将删除此目录中的所有文件和子目录。在安装期间,这主要用于提取将在[ Run ]部分中执行但在安装后不需要的文件。 |
Auto Constants
常量名 | 管理员权限安装 | 非管理员权限安装 |
---|---|---|
autoappdata | commonappdata | userappdata |
autocf | commoncf | usercf |
autocf32 | commoncf32 | usercf |
autocf64 | commoncf64 | usercf |
autodesktop | commondesktop | userdesktop |
autodocs | commondocs | userdocs |
autofonts | commonfonts | userfonts |
autopf | commonpf | userpf |
autopf32 | commonpf32 | userpf |
autopf64 | commonpf64 | userpf |
autoprograms | commonprograms | userprograms |
autostartmenu | commonstartmenu | userstartmenu |
autostartup | commonstartup | userstartup |
autotemplates | commontemplates | usertemplates |
其他常量
常量名 | 含义 |
---|---|
{cmd} | C:\Windows\System32\cmd.exe |
{computername} | 计算机名称 |
{username} | 用户名 |
PS:我有空出一个专栏,讲解java应用打包成exe以及Inno setup打包java应用安装包
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!❤️❤️❤️