在创建服务之前运行安装后文件替换

时间:2017-07-27 21:09:51

标签: inno-setup

我已经配置了以下脚本,要求用户输入IP地址作为安装向导的一部分,此地址将写入配置文件,应用程序将引用该文件以了解与之通信的位置。 但是,当前,服务是在更新配置文件之前创建的(Run部分发生在CurStep = ssPostInstall之前),因此在更新之前已经从文件中读取了默认值。 这意味着当前需要进行进一步的手动服务重启才能使应用程序进行通信。

我知道可以在Run之后发生ssPostInstall部分。

我已阅读文章Inno Setup: How to run a code procedure in Run section or before Run section?,建议我可以使用BeforeInstall:参数作为run命令的一部分来首先执行CurStepChanged过程。但是,这会导致错误

  

所需的功能或程序' CurStepChanged'发现但没有兼容的原型。

我还尝试在CurStepChanged部分上方移动运行行和命令(以尽可能地匹配提到的文章),但这仍然返回相同的错误。

任何人都可以提供一些关于配置错误的指导吗?

[Code]

var
  PrimaryServerPage: TInputQueryWizardPage;

function FileReplaceString(ReplaceString: string):boolean;
var
  MyFile : TStrings;
  MyText : string;
begin
  Log('Replacing in file');
  MyFile := TStringList.Create;

  try
    Result := true;

    try
      MyFile.LoadFromFile(ExpandConstant('{app}' + '\providers\print\win\print-provider.conf'));
      Log('File loaded');
      MyText := MyFile.Text;

      { Only save if text has been changed. }
      if StringChangeEx(MyText, 'REPLACE_WITH_CUSTOMER_IP', ReplaceString, True) > 0 then
      begin;
        Log('IP address inserted');
        MyFile.Text := MyText;
        MyFile.SaveToFile(ExpandConstant('{app}' + '\providers\print\win\print-provider.conf'));
        Log('File saved');
      end;
    except
      Result := false;
    end;
  finally
    MyFile.Free;
  end;

  Result := True;
end;

procedure InitializeWizard;
begin
  PrimaryServerPage :=
    CreateInputQueryPage(
      wpWelcome, 'Application Server Details', 'Where is installed?',
      'Please specify the IP address or hostname of your ' +
        'Primary Application Server, then click Next.');
  PrimaryServerPage.Add('Primary Application Server IP/Hostname:', False);
end;   

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    Log('File installed, replacing IP address');
    FileReplaceString(PrimaryServerPage.Values[0]);
  end;
end;


[run]
Filename: {sys}\sc.exe; Parameters: "create PCPrintProvider start= auto binPath= ""{app}\providers\print\win\pc-print.exe PCPrintProvider"" depend= Spooler" ; Flags: runhidden ; BeforeInstall: CurStepChanged
Filename: {sys}\sc.exe; Parameters: "start PCPrintProvider" ; Flags: runhidden ; BeforeInstall: CurStepChanged

2 个答案:

答案 0 :(得分:3)

您必须为BeforeInstall parameter定义自己的程序:

[Run]
Filename: {sys}\sc.exe; \
    Parameters: "create PCPrintProvider start= auto binPath= ""{app}\providers\print\win\pc-print.exe PCPrintProvider"" depend= Spooler"; \
    Flags: runhidden; BeforeInstall: ReplaceIPAddress
[Code]

procedure ReplaceIPAddress;
begin
  FileReplaceString(PrimaryServerPage.Values[0]);
end;

答案 1 :(得分:1)

尝试使用 Check param

[run]
Filename: {sys}\sc.exe; Parameters: "create PCPrintProvider start= auto binPath= ""{app}\providers\print\win\pc-print.exe PCPrintProvider"" depend= Spooler" ; Flags: runhidden ; Check: IsIpChanged;

[code]
function IsIpChanged: Boolean;
begin
    FileReplaceString(PrimaryServerPage.Values[0]);
    Result := True;
end;