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

时间:2016-06-16 21:00:02

标签: inno-setup pascalscript

目前我正在尝试制作一个安装程序实用程序,用于在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;

1 个答案:

答案 0 :(得分:0)

您不要自己致电NextButtonClick function。它是一个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;

一般情况下,您应该对目标系统进行任何更改,但只有在用户通过点击"安装" 确认安装后才能对&#34进行更改;准备好安装" 页面。

虽然您可以使用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;