2017-07-27 1 views
1

J'ai configuré le script ci-dessous pour demander à l'utilisateur une adresse IP dans le cadre de l'assistant d'installation, cette adresse est écrite dans un fichier de configuration auquel l'application se référera pour savoir où communiquer. avec. Toutefois, le service est créé avant la mise à jour du fichier de configuration (la section Run se trouve avant CurStep = ssPostInstall). La valeur par défaut a donc déjà été lue dans le fichier avant sa mise à jour. Cela signifie qu'un nouveau redémarrage manuel du service est actuellement requis pour que l'application communique.Exécuter le fichier d'installation après avoir remplacé le service

Je comprends qu'il est possible d'avoir la section Run après le ssPostInstall.

J'ai lu l'article Inno Setup: How to run a code procedure in Run section or before Run section? qui suggère que je peux utiliser le paramètre BeforeInstall: dans le cadre de la commande run pour exécuter la procédure CurStepChanged en premier. Cependant, ceci conduit à une erreur de

Fonction ou procédure requise 'CurStepChanged' trouvée mais pas avec un prototype compatible.

J'ai essayé aussi déplacer la ligne et commande run dessus de la section CurStepChanged (pour correspondre à l'article mentionné aussi près que possible), mais encore retourné la même erreur.

Quelqu'un peut-il donner des conseils sur l'endroit où je vais mal avec la configuration?

[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 
+0

Avez-vous essayez d'utiliser ** Check ** param dans la section [run]? –

Répondre

3

Vous devez définir votre propre procédure de 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; 
+0

Où dois-je insérer le code supplémentaire? J'ai déjà la procédure CurStepChanged, est-ce inséré dedans ou gardé séparé? – Matt

+1

Séparé. Il n'a rien à faire avec 'CurStepChanged'. Et vous avez réellement besoin d'enlever le 'CurStepChanged'. –

1

Essayez d'utiliser 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; 

+1

Bien que cela fonctionne en effet, c'est plutôt un hack, et tout à fait non intuitive. –