从 NextButtonClicked 方法 Inno Setup 将值传递到过程中

Passing values into a procedure from NextButtonClicked method Inno Setup

目前我正在尝试制作一个安装程序实用程序,用于在 Inno Setup 上为 Wi-Fi 设置静态 IP。当按下自定义页面的 Next 按钮时,我无法找到一种方法来插入正确的命令。 NextButtonClick 方法被正确调用,但是当我实际点击页面上的下一步按钮时,它只是退出而不执行查询。

procedure InitializeWizard();
var
  Page: TInputQueryWizardPage;
  ipAddress, subnetMask, defaultGateway, prefferredDNSServer: String;
  ResultCode: Integer;
begin
  Page := CreateInputQueryPage(wpWelcome,
    'Set Network Config', 'A window for setting the wifi configuration',
    'Please indicate the IP address and press next when finished.');

  { Add items (False means it's not a password edit) }
  Page.Add('IP Address:', False);
  Page.Add('Subnet mask:', False);
  Page.Add('Default gateway:', False);
  Page.Add('Preferred DNS server:', False);

  { Set initial values (optional) }
  Page.Values[0] := ExpandConstant('0.0.0.0');

  ipAddress := Page.Values[0]

  Page.Values[1] := ExpandConstant('0.0.0.0');

  subnetMask :=  Page.Values[1]

  Page.Values[2] := ExpandConstant('0.0.0.0');

  defaultGateway :=  Page.Values[2]

  Page.Values[3] := ExpandConstant('0.0.0.0');

  prefferredDNSServer :=  Page.Values[3]

  if NextButtonClick(Page.ID) then
  begin
    Exec('cmd.exe',
         '/k ' + 'netsh interface ip set address "Wi-Fi" static ' + ipAddress + ' ' +
           subnetMask + ' ' + defaultGateway + ' ' + prefferredDNSServer,
         '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
end; 

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ipAddress, subnetMask, defaultGateway, prefferredDNSServer: String;
  ResultCode: Integer;
begin
  Result := True

  Log('NextButtonClick(' + IntToStr(CurPageID) + ') called');
  case CurPageID of
    100:
      { ipAddress := getParams(ipAddress); }
      { setWifi(ipAddress, subnetMask, defaultGateway, prefferredDNSServer); }
      Result:= True;
  end;
end;

您没有调用 NextButtonClick function yourself. It's an event function,因此由 Inno Setup 调用。

代码应该是这样的:

var
  NetPage: TInputQueryWizardPage;

procedure InitializeWizard();
begin
  NetPage :=
    CreateInputQueryPage(wpWelcome,
      'Set Network Config', 'A window for setting the wifi configuration',
      'Please indicate the IP address and press next when finished.');

  { Add items (False means it's not a password edit) }
  NetPage.Add('IP Address:', False);
  NetPage.Add('Subnet mask:', False);
  NetPage.Add('Default gateway:', False);
  NetPage.Add('Preferred DNS server:', False);

  { Set initial values (optional) }
  NetPage.Values[0] := ExpandConstant('0.0.0.0');
  NetPage.Values[1] := ExpandConstant('0.0.0.0');
  NetPage.Values[2] := ExpandConstant('0.0.0.0');
  NetPage.Values[3] := ExpandConstant('0.0.0.0');
end; 

function NextButtonClick(CurPageID: Integer): Boolean;
var
  ipAddress, subnetMask, defaultGateway, prefferredDNSServer: String;
  ResultCode: Integer;
  Command: string;
begin
  Result := True;
  
  if CurPageID = NetPage.ID then
  begin
    ipAddress := NetPage.Values[0];
    subnetMask := NetPage.Values[1];
    defaultGateway := NetPage.Values[2];
    prefferredDNSServer := NetPage.Values[3];
   
    Command :=
      'netsh interface ip set address "Wi-Fi" static ' +
      ipAddress + ' ' + subnetMask + ' ' + defaultGateway + ' ' + prefferredDNSServer;
    Exec('cmd.exe', '/C ' + Command, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
end;

不过,一般来说,您应该对目标系统进行任何更改,直到用户通过单击 “安装” 确认安装 “就绪”安装页。

虽然您可以为此使用 CurPageID = wpReady,但更惯用的方法是使用 CurStepChanged(ssInstall)(或 ssPostInstall):

procedure CurStepChanged(CurStep: TSetupStep);
var
  ipAddress, subnetMask, defaultGateway, prefferredDNSServer: String;
  ResultCode: Integer;
  Command: string;
begin
  if CurStep = ssInstall then
  begin
    ipAddress := NetPage.Values[0];
    subnetMask := NetPage.Values[1];
    defaultGateway := NetPage.Values[2];
    prefferredDNSServer := NetPage.Values[3];
   
    Command :=
      'netsh interface ip set address "Wi-Fi" static ' +
      ipAddress + ' ' + subnetMask + ' ' + defaultGateway + ' ' + prefferredDNSServer;
    Exec('cmd.exe', '/C ' + Command, '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
  end;
end;