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

Inno Setup自定义页面字段值在[RUN]段的获取问题

解决Inno Setup自定义页面字段值在[RUN]段的调用问题

我完全懂你现在的困扰:自定义页面里明明输入了MYTESTPOINT,但到[RUN]段里引用时却显示控件标识而非实际值。这是因为Inno Setup的INI配置段(比如[RUN]、[Setup])没办法直接访问自定义页面的控件实例,必须通过全局变量+Code函数的方式把控件值暴露出来——就像你之前用向导页的{code:...}方法一样,只是自定义页面需要手动实现这个逻辑。

下面是一步步的解决流程,跟着做就能搞定:

1. 定义全局变量保存自定义页面/控件

首先在脚本的[Code]段最顶部,定义全局变量来绑定你的自定义页面或输入控件,这样后续函数才能访问到它:

var
  // 如果用系统自带的输入查询页面,用这个变量
  MyRestorePointPage: TInputQueryWizardPage;
  // 如果你是手动添加的Edit控件,就用这个:
  // MyRestorePointEdit: TNewEdit;

2. 初始化自定义页面

在InitializeWizard函数里创建你的自定义页面,同时把页面/控件的引用绑定到刚才的全局变量:

方式一:用系统自带的TInputQueryWizardPage(推荐,省布局功夫)

procedure InitializeWizard;
begin
  // 创建输入查询页面,放在欢迎页之后
  MyRestorePointPage := CreateInputQueryPage(wpWelcome,
    '系统还原点设置', 
    '请指定还原点名称', 
    '请输入你想要创建的系统还原点名称:');
  // 添加一个输入框,第二个参数设为False表示允许空值(必填就设为True)
  MyRestorePointPage.Add('还原点名称:', False);
end;

方式二:手动创建自定义页面和Edit控件

如果需要更灵活的布局,就自己搭建控件:

procedure InitializeWizard;
begin
  // 创建空白自定义页面
  MyRestorePointPage := CreateCustomPage(wpWelcome, '系统还原点设置', '请指定还原点名称');
  // 创建Edit输入框
  MyRestorePointEdit := TNewEdit.Create(MyRestorePointPage);
  MyRestorePointEdit.Parent := MyRestorePointPage.Surface;
  // 设置控件位置(比如距离顶部50px,左右各留20px)
  MyRestorePointEdit.Left := 20;
  MyRestorePointEdit.Top := 50;
  MyRestorePointEdit.Width := MyRestorePointPage.Surface.Width - 40;
  // 可以预设默认值
  MyRestorePointEdit.Text := 'MYTESTPOINT';
end;

3. 编写Code函数获取输入值

在[Code]段里写一个函数,作为INI段调用的入口,返回自定义页面输入框的值:

function GetRestorePointName(Param: String): String;
begin
  // 如果用的是TInputQueryWizardPage,直接取第一个输入框的值
  Result := Trim(MyRestorePointPage.Values[0]);
  // 如果是手动创建的Edit控件,就用Text属性:
  // Result := Trim(MyRestorePointEdit.Text);
  
  // 可选:如果用户没输入,设置一个默认值
  if Result = '' then
    Result := '安装{#MyAppName}时创建的还原点';
end;

4. 在[RUN]段调用这个Code函数

现在你就可以在[RUN]段里用{code:GetRestorePointName}获取输入值了,比如调用vssadmin创建还原点:

[Run]
; 示例:调用vssadmin创建指定名称的还原点
Filename: "vssadmin"; Parameters: "create shadow /auto=system /restorepoint={code:GetRestorePointName}"; Flags: runhidden waituntilterminated

如果你想用Inno Setup自带的系统还原点功能(无需手动调用vssadmin),直接在[Setup]段配置即可:

[Setup]
RestorePointName={code:GetRestorePointName}

为什么之前的方法不行?

你之前尝试的{txtProgram.text}写法只适用于Inno Setup内置的向导页控件(比如默认的目标文件夹输入框),自定义页面的控件是你自己创建的实例,INI段没有直接访问权限,必须通过全局变量+Code函数的方式传递值,这也是Inno Setup脚本的标准做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:43:03