如何为Inno Setup启动提示添加应用版本号显示
场景说明
使用Inno Setup开发安装包时,如果开启启动确认弹窗(对应配置DisableStartupPrompt=False),弹窗的展示文本来自本地化文件中的SetupLdrStartupMessage字段,以默认英文配置为例:
SetupLdrStartupMessage=This will install %1. Do you wish to continue?
当前存在的问题是:占位符%1默认只会被替换成[Setup]段中AppName定义的纯应用名称,没法直接展示带版本号的完整信息。
期望的弹窗显示效果为:
This will install MyApplicationName 4.1. Do you wish to continue?
试过通过Pascal的InitializeSetup()函数修改提示文本的方案,但完全不适用,原因有两个:
- 这个函数的执行时机晚于启动弹窗、语言选择弹窗的弹出流程,根本改不到最先出现的那个启动提示内容
- 要走这个方案就得给所有支持的语言重新编写对应的自定义提示文本,后续维护成本极高
零维护的实现方案
根本不需要写Pascal脚本、也不用逐个修改各语言文件里的提示文本,搞清楚启动弹窗的占位符替换逻辑,改一行[Setup]配置就能搞定:
- 负责弹出启动提示的SetupLdr加载模块,运行时比Pascal脚本、语言包加载的时机早得多,它替换
%1占位符的内容,直接读取安装包头部嵌入的AppVerName字段值,不会等后续流程加载完成 - 现在占位符只显示纯AppName的核心原因,是如果不在[Setup]段显式定义
AppVerName,编译器会默认把AppVerName的值设置成和AppName完全一致的纯应用名,不会自动拼接版本号
只需要在你的[Setup]段里显式声明AppVerName的拼接规则就行,比如:
[Setup] AppName=MyApplicationName AppVersion=4.1 ; 指定启动提示里%1要替换的内容 AppVerName={#AppName} {#AppVersion}
重新编译安装包后,启动弹窗里的%1就会自动替换成MyApplicationName 4.1的完整内容。所有你引入的多语言包不需要做任何修改,因为占位符的位置、前后的文本内容完全没动,只替换占位符对应的参数值。
这个方案后续维护也零成本:每次升级版本只需要修改AppVersion的值,启动提示里的内容会自动同步更新,完全不用挨个调整各语言的配置。
如果你用的是Inno Setup 4.x这类很早的版本,这一版本的SetupLdr确实是直接读取AppName作为%1的替换值,也不需要写自定义脚本——只需要通过编译变量把内部逻辑用的纯应用名、展示用的带版本应用名做拆分,完全不会影响安装流程的其他环节。
内容的提问来源于stack exchange,提问作者Maël Le Monnier

