From e51d9dce6a850a782d44d5e511a9b6f5040ba3b8 Mon Sep 17 00:00:00 2001 From: wangjia <809946525@qq.com> Date: Sun, 12 Jul 2026 07:27:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(windows):=20=E6=81=A2=E5=A4=8D=20pangolin.i?= =?UTF-8?q?ss(=E4=B8=8A=E4=B8=AA=E6=8F=90=E4=BA=A4=E8=A2=AB=E5=9D=8F=20one?= =?UTF-8?q?-liner=20=E6=B8=85=E7=A9=BA)+=20bump=201.0.69?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u --- client/windows/installer/pangolin.iss | 91 +++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/client/windows/installer/pangolin.iss b/client/windows/installer/pangolin.iss index e69de29..23c53d3 100644 --- a/client/windows/installer/pangolin.iss +++ b/client/windows/installer/pangolin.iss @@ -0,0 +1,91 @@ +; 穿山甲 Pangolin Windows 安装包 (Inno Setup 6) +; 编译: ISCC.exe pangolin.iss (或用 Inno Setup Compiler 打开) +; 前置: 先在 client/ 跑 `flutter build windows`(Release),产物在 +; ..\..\build\windows\x64\runner\Release +#define MyAppName "穿山甲 Pangolin" +#define MyAppVersion "1.0.69" +#define MyAppPublisher "Pangolin" +#define MyAppExeName "pangolin_vpn.exe" +#define BuildDir "..\..\build\windows\x64\runner\Release" + +[Setup] +AppId={{B2F1B0A0-7A3C-4C2E-9E5A-1A2B3C4D5E6F} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +DefaultDirName={autopf}\Pangolin +DefaultGroupName=Pangolin +DisableProgramGroupPage=yes +OutputBaseFilename=pangolin-setup-{#MyAppVersion} +Compression=lzma2 +SolidCompression=yes +WizardStyle=modern +; 安装需管理员(写 Program Files;app 本身 requireAdministrator) +PrivilegesRequired=admin +ArchitecturesInstallIn64BitMode=x64compatible + +[Languages] +; ChineseSimplified.isl 随仓库附带(此 Inno Setup 安装未含官方简中语言包),与本 .iss 同目录 +Name: "chinesesimplified"; MessagesFile: "ChineseSimplified.isl" +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Files] +; 整个 Release 目录(含 pangolin_vpn.exe / flutter_windows.dll / data\ / +; 插件 dll / sing-box.exe / wintun.dll) +Source: "{#BuildDir}\*"; DestDir: "{app}"; Flags: recursesubdirs createallsubdirs ignoreversion + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}" + +[Run] +; runascurrentuser:安装包是 admin 提权运行的,默认 postinstall 会降回普通用户身份拉起 +; app(Inno 的 RunAsOriginalUser)→ requireAdministrator 的 app 起不来/没管理员权,TUN 建不了。 +; 加此标志用安装包自身的管理员令牌拉起,装完即以管理员运行、不额外弹 UAC。 +Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent runascurrentuser + +[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;