侧边栏壁纸
博主头像
DevWiki博主等级

不怕慢,只怕站!

  • 累计撰写 156 篇文章
  • 累计创建 90 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

InnoSetup打包问题分析解决

DevWiki
2023-11-06 / 0 评论 / 0 点赞 / 4 阅读 / 10019 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

image-20231102200902644

1. 背景概要

最近在解决一个项目的安装包需求:

用户双击安装包以后,让用户确认安装, 然后显示安装进度, 最后提示完成。但是有一下几点要求:

  1. 不创建桌面图标
  2. 不创建开始菜单文件夹和图标
  3. 双击安装后主程序不能直接运行,只能被链接启动

项目中使用的打包方式是 Inno Setup,对于前面的要求都可以通过修改脚本完成,最后一步需要在代码中接收启动参数时进行处理。

2. 一般安装过程

下面是一个程序的一般安装过程,基本满足的大部分用户需求:

  1. 支持当前用户安装或所有用户安装
  2. 支持选择安装语言
  3. 支持安装许可
  4. 支持安装前说明
  5. 支持选择安装位置,默认为用户程序目录
  6. 支持创建桌面快捷方式
  7. 支持显示安装进度
  8. 支持安装后说明
  9. 支持安装完成后是否启动应用

选择安装模式

image-20231031185030229

选择安装语言

image-20231031185122461

安装许可

image-20231031185142868

安装前提示

image-20231031185200152

安装位置

image-20231031185232380

附加任务:桌面快捷方式

image-20231031185255587

安装确认准备

image-20231031185320132

安装进度

image-20231031185346479

安装完成说明

image-20231031185410648

安装完成

image-20231031185429056

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 ; 在安装完成后运行应用程序

现在逐步对上述脚本进行改造,以满足需求。

  1. 禁止安装模式选择,只使用“当前用户安装”

注释 PrivilegesRequiredOverridesAllowed=dialog ; 设置权限要求的覆盖方式

  1. 禁用语言选择

注释 "设置语言为英文" 部分

  1. 禁用安装许可和安装前提示

直接注释 LicenseFileInfoBeforeFile

  1. 禁用安装准备完成界面

[Setup] 区段添加 DisableReadyPage=true

  1. 禁止创建图标开始菜单图标

[Setup]区段添加 AllowNoIcons=true

注释 [Tasks] [Icon]区段所有内容

  1. 禁止用户选择安装路径

[Setup]区段添加 DisableDirPage=true

  1. 禁止安装完成提示和启动提示

注释 [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. 后记

上述只是在安装阶段满足了用户需求, 还需要进一步优化的地方有:

  1. 覆盖安装删除之前的图标
  2. 覆盖安装卸载之前的程序
  3. 覆盖安装如果程序在运行需要停止正在运行的程序

这些需要根据 Inno Setup的帮助,在 [Code] 区段的 function InitializeSetup(): Boolean;函数中处理。

以上为本次解决问题的过程,如果有帮助麻烦点赞支持~

文中使用的 Inno Setup有中文版本,关注我的微信后回复:InnoSetup 获取中文版本。

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区