From 8d3c5da7ee00a36235268d5a0687a4ec47946331 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sat, 27 Jun 2026 20:42:54 +0800 Subject: [PATCH] =?UTF-8?q?fix(client/windows):=20installer=20=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E4=BF=AE=E5=A4=8D=20=E2=80=94=20=E8=A3=85=E6=96=B0?= =?UTF-8?q?=E7=89=88=E5=89=8D=E9=9D=99=E9=BB=98=E5=8D=B8=E8=BD=BD=E9=81=97?= =?UTF-8?q?=E7=95=99=20AppId=20=E7=9A=84=201.0.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1.0.0 的 AppId 是非法 GUID(...PANGOLIN0001),1.0.1 起改成合法 GUID。 AppId 不同 → Inno 视为两个独立产品 → 控制面板里 1.00/1.01 并排不覆盖。 当前 AppId 已稳定会原地升级;再在 ssInstall 前把遗留 AppId 的残留装 静默卸掉(/VERYSILENT),清掉已并存的 1.0.0 幽灵。版本 bump 1.0.2→1.0.3。 Co-Authored-By: Claude Opus 4.8 --- client/windows/installer/pangolin.iss | 41 ++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/client/windows/installer/pangolin.iss b/client/windows/installer/pangolin.iss index 6dbdb72..37b2abc 100644 --- a/client/windows/installer/pangolin.iss +++ b/client/windows/installer/pangolin.iss @@ -3,7 +3,7 @@ ; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在 ; ..\..\build\windows\x64\runner\Release #define MyAppName "穿山甲 Pangolin" -#define MyAppVersion "1.0.2" +#define MyAppVersion "1.0.3" #define MyAppPublisher "Pangolin" #define MyAppExeName "pangolin_vpn.exe" #define BuildDir "..\..\build\windows\x64\runner\Release" @@ -47,3 +47,42 @@ Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}} [UninstallDelete] ; 卸载清理运行期数据(kernel 配置等) Type: filesandordirs; Name: "{localappdata}\Pangolin" + +[Code] +{ ── 升级覆盖修复 ────────────────────────────────────────────────────────── + 历史坑:1.0.0 的 AppId 是非法 GUID(...PANGOLIN0001),1.0.1 起改成当前合法 + GUID。AppId 不同 → Inno 视为两个独立产品 → 旧版不被覆盖,控制面板里并排两个。 + 当前 AppId 已稳定(1.0.1+ 同源,会原地升级);此处在安装前再把那个遗留 AppId + 的残留装静默卸掉,清掉已并存的 1.0.0 幽灵,杜绝多版本并排。} +const + LegacyAppId = '{B2F1B0A0-7A3C-4C2E-9E5A-PANGOLIN0001}_is1'; + +function GetUninstallString(const SubKey: string): string; +var + s: string; +begin + s := ''; + if not RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s) then + if not RegQueryStringValue(HKLM32, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s) then + RegQueryStringValue(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + SubKey, 'UninstallString', s); + Result := s; +end; + +procedure RemoveLegacyVersion; +var + uninst: string; + rc: Integer; +begin + uninst := GetUninstallString(LegacyAppId); + if uninst <> '' then + begin + uninst := RemoveQuotes(uninst); + Exec(uninst, '/VERYSILENT /SUPPRESSMSGBOXES /NORESTART', '', SW_HIDE, ewWaitUntilTerminated, rc); + end; +end; + +procedure CurStepChanged(CurStep: TSetupStep); +begin + if CurStep = ssInstall then + RemoveLegacyVersion; +end;