1. 背景概要
最近在解决一个项目的安装包需求:
用户双击安装包以后,让用户确认安装, 然后显示安装进度, 最后提示完成。但是有一下几点要求:
- 不创建桌面图标
- 不创建开始菜单文件夹和图标
- 双击安装后主程序不能直接运行,只能被链接启动
项目中使用的打包方式是 Inno Setup,对于前面的要求都可以通过修改脚本完成,最后一步需要在代码中接收启动参数时进行处理。
2. 一般安装过程
下面是一个程序的一般安装过程,基本满足的大部分用户需求:
- 支持当前用户安装或所有用户安装
- 支持选择安装语言
- 支持安装许可
- 支持安装前说明
- 支持选择安装位置,默认为用户程序目录
- 支持创建桌面快捷方式
- 支持显示安装进度
- 支持安装后说明
- 支持安装完成后是否启动应用
选择安装模式
选择安装语言
安装许可
安装前提示
安装位置
附加任务:桌面快捷方式
安装确认准备
安装进度
安装完成说明
安装完成
3. 脚本文件改造
以下为上述安装过程的脚本内容,并包含了必要的注释:
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define MyAppName "DevWiki" ; 设置应用程序名称
#define MyAppVersion "1.0.0" ; 设置应用程序版本
#define MyAppPublisher "DevWiki" ; 设置应用程序发布者
#define MyAppURL "http://blog.devwiki.net" ; 设置应用程序网址
#define MyAppExeName "MyProg.exe" ; 设置应用程序的可执行文件名称
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
AppId={{15E14FAA-0CE2-4084-9275-728CF14F09E4} ; 设置应用程序的唯一标识符
AppName={#MyAppName} ; 使用上面定义的应用程序名称
AppVersion={#MyAppVersion} ; 使用上面定义的应用程序版本
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher} ; 使用上面定义的应用程序发布者
AppPublisherURL={#MyAppURL} ; 使用上面定义的发布者网址
AppSupportURL={#MyAppURL} ; 使用上面定义的支持网址
AppUpdatesURL={#MyAppURL} ; 使用上面定义的更新网址
DefaultDirName={autopf}\{#MyAppName} ; 设置默认安装目录
DisableProgramGroupPage=yes ; 禁用程序组选择页面
UsedUserAreasWarning=no ; 禁用用户区域警告
LicenseFile=D:\Code\InnoSetup\安装许可.txt ; 设置许可文件的路径
InfoBeforeFile=D:\Code\InnoSetup\安装之前.txt ; 设置安装前信息文件的路径
InfoAfterFile=D:\Code\InnoSetup\安装之后.txt ; 设置安装后信息文件的路径
; 移除以下行,以在管理安装模式下运行(为所有用户安装)。
PrivilegesRequired=lowest ; 设置所需的权限为最低
PrivilegesRequiredOverridesAllowed=dialog ; 设置权限要求的覆盖方式
OutputDir=D:\Code\InnoSetup ; 设置输出目录
OutputBaseFilename=mysetup ; 设置输出文件的基本名称
Compression=lzma ; 使用LZMA压缩
SolidCompression=yes ; 启用实体压缩
WizardStyle=modern ; 使用现代风格的向导
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl" ; 设置语言为简体中文
Name: "english"; MessagesFile: "compiler:Languages\English.isl" ; 设置语言为英文
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked ; 创建桌面图标任务
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode ; 创建快速启动图标任务
[Files]
Source: "C:\Program Files (x86)\Inno Setup 6\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion” ; 复制应用程序文件到目标目录
[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" ; 创建开始菜单程序组图标
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon ; 创建桌面图标
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon ; 创建快速启动图标
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent ; 在安装完成后运行应用程序
现在逐步对上述脚本进行改造,以满足需求。
- 禁止安装模式选择,只使用“当前用户安装”
注释 PrivilegesRequiredOverridesAllowed=dialog ; 设置权限要求的覆盖方式
- 禁用语言选择
注释 "设置语言为英文" 部分
- 禁用安装许可和安装前提示
直接注释 LicenseFile
和 InfoBeforeFile
- 禁用安装准备完成界面
[Setup] 区段添加 DisableReadyPage=true
- 禁止创建图标开始菜单图标
[Setup]区段添加 AllowNoIcons=true
注释 [Tasks] [Icon]区段所有内容
- 禁止用户选择安装路径
[Setup]区段添加 DisableDirPage=true
- 禁止安装完成提示和启动提示
注释 [Run]区段内容和 [Setup]区段的 InfoAfterFile
下面是修改后的脚本:
; 脚本由 Inno Setup 脚本向导 生成!
; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档!
#define MyAppName "DevWiki" ; 设置应用程序名称
#define MyAppVersion "1.0.0" ; 设置应用程序版本
#define MyAppPublisher "DevWiki" ; 设置应用程序发布者
#define MyAppURL "http://blog.devwiki.net" ; 设置应用程序网址
#define MyAppExeName "MyProg.exe" ; 设置应用程序的可执行文件名称
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (若要生成新的 GUID,可在菜单中点击 "工具|生成 GUID"。)
AppId={{15E14FAA-0CE2-4084-9275-728CF14F09E4} ; 设置应用程序的唯一标识符
AppName={#MyAppName} ; 使用上面定义的应用程序名称
AppVersion={#MyAppVersion} ; 使用上面定义的应用程序版本
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher} ; 使用上面定义的应用程序发布者
AppPublisherURL={#MyAppURL} ; 使用上面定义的发布者网址
AppSupportURL={#MyAppURL} ; 使用上面定义的支持网址
AppUpdatesURL={#MyAppURL} ; 使用上面定义的更新网址
DefaultDirName={autopf}\{#MyAppName} ; 设置默认安装目录
DisableProgramGroupPage=yes ; 禁用程序组选择页面
DisableReadyPage=true ; 禁用"准备安装"页面
DisableDirPage=true ; 禁用目录选择页面
AllowNoIcons=true ; 允许不创建桌面图标和快速启动图标
UsedUserAreasWarning=no ; 禁用用户区域警告
;LicenseFile=D:\Code\InnoSetup\安装许可.txt
;InfoBeforeFile=D:\Code\InnoSetup\安装之前.txt
;InfoAfterFile=D:\Code\InnoSetup\安装之后.txt
; 移除以下行,以在管理安装模式下运行(为所有用户安装)。
PrivilegesRequired=lowest ; 设置所需的权限为最低
;PrivilegesRequiredOverridesAllowed=dialog ; 设置权限要求的覆盖方式
OutputDir=D:\Code\InnoSetup ; 设置输出目录
OutputBaseFilename=mysetup ; 设置输出文件的基本名称
Compression=lzma ; 使用LZMA压缩
SolidCompression=yes ; 启用实体压缩
WizardStyle=modern ; 使用现代风格的向导
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl" ; 设置语言为简体中文
;Name: "english"; MessagesFile: "compiler:Languages\English.isl" ; 设置语言为英文
[Tasks]
;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked ; 创建桌面图标任务
;Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode ; 创建快速启动图标任务
[Files]
Source: "C:\Program Files (x86)\Inno Setup 6\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion” ; 复制应用程序文件到目标目录
[Icons]
;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
;Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
[Run]
;Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
4. 后记
上述只是在安装阶段满足了用户需求, 还需要进一步优化的地方有:
- 覆盖安装删除之前的图标
- 覆盖安装卸载之前的程序
- 覆盖安装如果程序在运行需要停止正在运行的程序
这些需要根据 Inno Setup的帮助,在 [Code] 区段的 function InitializeSetup(): Boolean;
函数中处理。
以上为本次解决问题的过程,如果有帮助麻烦点赞支持~
文中使用的 Inno Setup有中文版本,关注我的微信后回复:InnoSetup 获取中文版本。