chore(release): v0.7.14

Remplace l'enregistrement du service wgsecure-helper (sc.exe create/
start via [Run]) par un appel Exec()+AddQuotes en Pascal script :
l'échappement de guillemets imbriqués dans la chaîne Parameters
produisait une commande sc.exe invalide, silencieusement, alors que
la même commande fonctionnait lancée à la main. Le service n'était
donc jamais enregistré malgré une installation "réussie".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-04 20:52:24 +02:00
co-authored by Claude Sonnet 5
parent 8ec7dc6aaf
commit dd0df78341
5 changed files with 62 additions and 21 deletions
+51 -17
View File
@@ -5,7 +5,7 @@
; ──────────────────────────────────────────────
#define MyAppName "WGSecure"
#define MyAppVersion "0.7.13"
#define MyAppVersion "0.7.14"
#define MyAppPublisher "WGSecure"
#define MyAppExeName "wgsecure.exe"
@@ -59,20 +59,8 @@ Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/install /quiet /norestart"; S
; (PrivilegesRequired=admin ci-dessus), donc pas d'UAC supplémentaire non plus.
; `waituntilterminated` : l'app ne doit pas démarrer avant que wg.exe existe.
Filename: "{tmp}\wireguard-installer.exe"; StatusMsg: "Installation de WireGuard…"; Check: WireGuardNeedsInstall; Flags: waituntilterminated
; Enregistre et démarre le service privilégié s'il a été fourni (cf. [Files]
; ci-dessus). "binPath= " avec l'espace après "=" est une exigence de la
; syntaxe sc.exe, pas d'Inno Setup — l'oublier fait échouer la commande.
Filename: "{sys}\sc.exe"; Parameters: "create WGSecureHelper binPath= ""{app}\wgsecure-helper.exe"" start= auto DisplayName= ""WGSecure Helper"""; StatusMsg: "Installation du service WGSecure Helper…"; Check: HelperServiceAvailable; Flags: runhidden
Filename: "{sys}\sc.exe"; Parameters: "start WGSecureHelper"; StatusMsg: "Démarrage du service WGSecure Helper…"; Check: HelperServiceAvailable; Flags: runhidden
Filename: "{app}\{#MyAppExeName}"; Description: "Lancer {#MyAppName}"; Flags: nowait postinstall skipifsilent
[UninstallRun]
; Arrête puis supprime le service avant que ses fichiers ne disparaissent —
; sc.exe ignore silencieusement une commande sur un service déjà absent
; (ex. installeur généré sans le composant service), donc pas de Check ici.
Filename: "{sys}\sc.exe"; Parameters: "stop WGSecureHelper"; Flags: runhidden; RunOnceId: "StopWGSecureHelper"
Filename: "{sys}\sc.exe"; Parameters: "delete WGSecureHelper"; Flags: runhidden; RunOnceId: "DeleteWGSecureHelper"
[Code]
function VCRedistNeedsInstall: Boolean;
var
@@ -90,9 +78,55 @@ begin
Result := not FileExists(ExpandConstant('{pf}\WireGuard\wireguard.exe'));
end;
function HelperServiceAvailable: Boolean;
// Enregistre et démarre le service privilégié (cf. app/service/) via
// Exec()+AddQuotes plutôt que des entrées [Run] à guillemets échappés
// ("" imbriqués) : une tentative précédente basée sur l'échappement de
// chaîne Inno Setup produisait une commande sc.exe invalide (silencieuse,
// aucune erreur visible pendant l'installation) alors que la même commande
// fonctionnait telle quelle lancée à la main — AddQuotes() gère le
// guillemetage de façon fiable, sans juggler des niveaux d'échappement
// imbriqués à la main.
procedure InstallHelperService;
var
ResultCode: Integer;
ExePath, Params: String;
begin
// wgsecure-helper.exe est optionnel (skipifsourcedoesntexist dans
// [Files]) : n'enregistrer le service que si le binaire a bien été copié.
Result := FileExists(ExpandConstant('{app}\wgsecure-helper.exe'));
ExePath := ExpandConstant('{app}\wgsecure-helper.exe');
// Optionnel (skipifsourcedoesntexist dans [Files]) : n'enregistrer le
// service que si le binaire a bien été copié.
if not FileExists(ExePath) then
exit;
Params := 'create WGSecureHelper binPath= ' + AddQuotes(ExePath) +
' start= auto DisplayName= ' + AddQuotes('WGSecure Helper');
Exec(ExpandConstant('{sys}\sc.exe'), Params, '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
Exec(ExpandConstant('{sys}\sc.exe'), 'start WGSecureHelper', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
end;
// sc.exe ignore silencieusement une commande sur un service déjà absent
// (ex. installeur généré sans le composant service) : pas besoin de tester
// son existence avant d'arrêter/supprimer.
procedure UninstallHelperService;
var
ResultCode: Integer;
begin
Exec(ExpandConstant('{sys}\sc.exe'), 'stop WGSecureHelper', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
Exec(ExpandConstant('{sys}\sc.exe'), 'delete WGSecureHelper', '', SW_HIDE,
ewWaitUntilTerminated, ResultCode);
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
InstallHelperService;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
UninstallHelperService;
end;