You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Inno Setup自定义页面中选择并设置BinVer值?

解决方案

核心思路

#define 是编译时预定义常量,无法在安装运行时动态修改。要实现安装时选择版本,需要:

  1. 创建自定义单选页面让用户选择版本
  2. 用全局变量存储用户选择的版本值
  3. 把原来使用 {#BinVer} 的地方,替换为运行时动态解析的路径/操作

完整代码示例

[Setup]
AppName=My Application
AppVersion=1.0
DefaultDirName={pf}\My Application

; 定义源文件根路径(根据实际路径修改)
#define CompPath "C:\YourCompPath"

[Files]
; 动态匹配对应版本的文件:假设不同版本文件存放在{#CompPath}\Folder\版本号\下
Source: "{#CompPath}\Folder\*\sed.exe"; 
DestDir: "{app}\bin\{code:GetBinVer}\files\gui\unbound\"; 
Flags: deleteafterinstall; 
Check: IsVersionMatching(CurrentFileName)

[Code]
var
  BinVerPage: TInputOptionWizardPage;
  SelectedBinVer: string;

; 动态返回选中的版本号,用于路径替换
function GetBinVer(Value: string): string;
begin
  Result := SelectedBinVer;
end;

; 过滤文件,只复制选中版本的文件
function IsVersionMatching(FileName: string): Boolean;
var
  VersionDir: string;
begin
  VersionDir := ExtractFileName(ExtractFilePath(FileName));
  Result := (VersionDir = SelectedBinVer);
end;

procedure InitializeWizard();
begin
  ; 创建版本选择页面,放在欢迎页之后
  BinVerPage := CreateInputOptionPage(wpWelcome,
    '选择版本', '请选择要安装的BinVer版本',
    '请从下方选择对应的版本:', False, False);
  
  ; 添加单选按钮,关联对应版本值
  BinVerPage.Add('版本 1 (111111)', '111111');
  BinVerPage.Add('版本 2 (222222)', '222222');
  BinVerPage.Add('版本 3 (333333)', '333333');
  
  ; 默认选中第一个版本
  BinVerPage.SelectedValueIndex := 0;
  SelectedBinVer := '111111';
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  ; 用户离开版本选择页时,保存选中的版本值
  if CurPageID = BinVerPage.ID then
  begin
    SelectedBinVer := BinVerPage.Values[BinVerPage.SelectedValueIndex];
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  SavedBinVer: string;
begin
  case CurUninstallStep of
    usPostUninstall:
      begin
        ; 卸载时从注册表读取安装时保存的版本号
        if RegQueryStringValue(HKLM, 'Software\My Application', 'BinVer', SavedBinVer) then
        begin
          CreateDir(ExpandConstant('{app}\bin\' + SavedBinVer + '\files'));
        end;
      end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    ; 安装完成后,将选中的版本写入注册表,供卸载时使用
    RegWriteStringValue(HKLM, 'Software\My Application', 'BinVer', SelectedBinVer);
  end;
end;

关键修改说明

  1. 替换预定义常量为运行时变量

    • 移除原 #define BinVer,改用全局变量 SelectedBinVer 存储用户选择的版本
    • 用 {code:GetBinVer} 代替 {#BinVer},实现运行时动态路径替换
  2. 文件复制的动态过滤

    • 假设不同版本文件存放在对应版本号的子目录下,用通配符 * 匹配目录,再通过 Check 函数只复制选中版本的文件
  3. 卸载时的版本获取

    • 安装时将选中版本写入注册表,卸载时从注册表读取该值,避免卸载时丢失版本信息

对您尝试代码的修正

您之前的代码存在以下问题:

  • 错误使用 GetInputOptionPage(wpWelcome),应直接保存创建页面的变量(BinVerPage)而非通过页面ID查找
  • 未处理卸载时的版本获取逻辑,卸载程序无法直接访问安装时的变量,必须通过注册表存储版本信息

内容的提问来源于stack exchange,提问作者Jerry Zoden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14