177 lines
7.4 KiB
SAS
Executable File
177 lines
7.4 KiB
SAS
Executable File
[Setup]
|
||
AppId={{APP_ID}}
|
||
AppVersion={{APP_VERSION}}
|
||
AppName={{DISPLAY_NAME}}
|
||
AppPublisher={{PUBLISHER_NAME}}
|
||
AppPublisherURL={{PUBLISHER_URL}}
|
||
AppSupportURL={{PUBLISHER_URL}}
|
||
AppUpdatesURL={{PUBLISHER_URL}}
|
||
DefaultDirName={{INSTALL_DIR_NAME}}
|
||
DisableProgramGroupPage=yes
|
||
OutputDir=.
|
||
OutputBaseFilename={{OUTPUT_BASE_FILENAME}}
|
||
Compression=lzma
|
||
SolidCompression=yes
|
||
SetupIconFile={{SETUP_ICON_FILE}}
|
||
WizardStyle=modern
|
||
LanguageDetectionMethod=uilanguage
|
||
UsePreviousTasks=no
|
||
PrivilegesRequired={{PRIVILEGES_REQUIRED}}
|
||
ArchitecturesAllowed=x64
|
||
ArchitecturesInstallIn64BitMode=x64
|
||
CloseApplications=force
|
||
|
||
[Languages]
|
||
{% for locale in LOCALES %}
|
||
{% if locale == 'en' %}Name: "english"; MessagesFile: "compiler:Default.isl"{% endif %}
|
||
{% if locale == 'hy' %}Name: "armenian"; MessagesFile: "compiler:Languages\\Armenian.isl"{% endif %}
|
||
{% if locale == 'bg' %}Name: "bulgarian"; MessagesFile: "compiler:Languages\\Bulgarian.isl"{% endif %}
|
||
{% if locale == 'ca' %}Name: "catalan"; MessagesFile: "compiler:Languages\\Catalan.isl"{% endif %}
|
||
{% if locale == 'zh' %}Name: "chinesesimplified"; MessagesFile: "compiler:Languages\\ChineseSimplified.isl"{% endif %}
|
||
{% if locale == 'zh-cn' %}Name: "chinesesimplified"; MessagesFile: "compiler:Languages\\ChineseSimplified.isl"{% endif %}
|
||
{% if locale == 'zh_CN' %}Name: "chinesesimplified"; MessagesFile: "compiler:Languages\\ChineseSimplified.isl"{% endif %}
|
||
{% if locale == 'co' %}Name: "corsican"; MessagesFile: "compiler:Languages\\Corsican.isl"{% endif %}
|
||
{% if locale == 'cs' %}Name: "czech"; MessagesFile: "compiler:Languages\\Czech.isl"{% endif %}
|
||
{% if locale == 'da' %}Name: "danish"; MessagesFile: "compiler:Languages\\Danish.isl"{% endif %}
|
||
{% if locale == 'nl' %}Name: "dutch"; MessagesFile: "compiler:Languages\\Dutch.isl"{% endif %}
|
||
{% if locale == 'fi' %}Name: "finnish"; MessagesFile: "compiler:Languages\\Finnish.isl"{% endif %}
|
||
{% if locale == 'fr' %}Name: "french"; MessagesFile: "compiler:Languages\\French.isl"{% endif %}
|
||
{% if locale == 'de' %}Name: "german"; MessagesFile: "compiler:Languages\\German.isl"{% endif %}
|
||
{% if locale == 'he' %}Name: "hebrew"; MessagesFile: "compiler:Languages\\Hebrew.isl"{% endif %}
|
||
{% if locale == 'is' %}Name: "icelandic"; MessagesFile: "compiler:Languages\\Icelandic.isl"{% endif %}
|
||
{% if locale == 'it' %}Name: "italian"; MessagesFile: "compiler:Languages\\Italian.isl"{% endif %}
|
||
{% if locale == 'ja' %}Name: "japanese"; MessagesFile: "compiler:Languages\\Japanese.isl"{% endif %}
|
||
{% if locale == 'no' %}Name: "norwegian"; MessagesFile: "compiler:Languages\\Norwegian.isl"{% endif %}
|
||
{% if locale == 'pl' %}Name: "polish"; MessagesFile: "compiler:Languages\\Polish.isl"{% endif %}
|
||
{% if locale == 'pt' %}Name: "portuguese"; MessagesFile: "compiler:Languages\\Portuguese.isl"{% endif %}
|
||
{% if locale == 'ru' %}Name: "russian"; MessagesFile: "compiler:Languages\\Russian.isl"{% endif %}
|
||
{% if locale == 'sk' %}Name: "slovak"; MessagesFile: "compiler:Languages\\Slovak.isl"{% endif %}
|
||
{% if locale == 'sl' %}Name: "slovenian"; MessagesFile: "compiler:Languages\\Slovenian.isl"{% endif %}
|
||
{% if locale == 'es' %}Name: "spanish"; MessagesFile: "compiler:Languages\\Spanish.isl"{% endif %}
|
||
{% if locale == 'tr' %}Name: "turkish"; MessagesFile: "compiler:Languages\\Turkish.isl"{% endif %}
|
||
{% if locale == 'uk' %}Name: "ukrainian"; MessagesFile: "compiler:Languages\\Ukrainian.isl"{% endif %}
|
||
{% endfor %}
|
||
|
||
[Tasks]
|
||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce
|
||
Name: "launchAtStartup"; Description: "{cm:AutoStartProgram,{{DISPLAY_NAME}}}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce
|
||
[Files]
|
||
Source: "{{SOURCE_DIR}}\\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
|
||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||
|
||
[Icons]
|
||
Name: "{autoprograms}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}"
|
||
Name: "{autodesktop}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}"; Tasks: desktopicon
|
||
Name: "{userstartup}\\{{DISPLAY_NAME}}"; Filename: "{app}\\{{EXECUTABLE_NAME}}"; WorkingDir: "{app}"; Tasks: launchAtStartup
|
||
[Run]
|
||
Filename: "{app}\\{{EXECUTABLE_NAME}}"; Description: "{cm:LaunchProgram,{{DISPLAY_NAME}}}"; Flags: {% if PRIVILEGES_REQUIRED == 'admin' %}runascurrentuser{% endif %} nowait postinstall skipifsilent
|
||
|
||
[UninstallDelete]
|
||
Type: filesandordirs; Name: "{app}"
|
||
Type: filesandordirs; Name: "{localappdata}\\{{DISPLAY_NAME}}"
|
||
Type: filesandordirs; Name: "{userappdata}\\{{DISPLAY_NAME}}"
|
||
Type: filesandordirs; Name: "{tmp}\\{{DISPLAY_NAME}}"
|
||
|
||
[Registry]
|
||
Root: HKCU; Subkey: "Software\\{{DISPLAY_NAME}}"; Flags: uninsdeletekey
|
||
Root: HKLM; Subkey: "Software\\{{DISPLAY_NAME}}"; Flags: uninsdeletekey
|
||
|
||
[Code]
|
||
procedure AppendLog(S: string);
|
||
begin
|
||
SaveStringToFile(ExpandConstant('{tmp}\\{{DISPLAY_NAME}}_installer.log'), S + #13#10, True);
|
||
end;
|
||
|
||
procedure TerminateProcesses();
|
||
var ResultCode: Integer;
|
||
begin
|
||
try
|
||
Exec('taskkill', '/F /IM {{EXECUTABLE_NAME}}', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||
except
|
||
AppendLog('terminate failed: {{EXECUTABLE_NAME}}');
|
||
end;
|
||
try
|
||
Exec('taskkill', '/F /IM HiFastVPNCli.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||
except
|
||
AppendLog('terminate failed: HiFastVPNCli.exe');
|
||
end;
|
||
end;
|
||
|
||
procedure StopServices();
|
||
var ResultCode: Integer;
|
||
begin
|
||
try
|
||
Exec('net', 'stop "HiFastVPNTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||
Exec('sc.exe', 'delete "HiFastVPNTunnelService"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
||
except
|
||
AppendLog('service stop/delete failed: HiFastVPNTunnelService');
|
||
end;
|
||
end;
|
||
|
||
procedure CleanPaths();
|
||
var ok: Boolean;
|
||
begin
|
||
try
|
||
if DirExists(ExpandConstant('{app}')) then
|
||
ok := DelTree(ExpandConstant('{app}'), True, True, True)
|
||
else ok := True;
|
||
if not ok then AppendLog('delete failed: {app}');
|
||
except
|
||
AppendLog('exception deleting: {app}');
|
||
end;
|
||
try
|
||
if DirExists(ExpandConstant('{localappdata}\\{{DISPLAY_NAME}}')) then
|
||
ok := DelTree(ExpandConstant('{localappdata}\\{{DISPLAY_NAME}}'), True, True, True);
|
||
if DirExists(ExpandConstant('{userappdata}\\{{DISPLAY_NAME}}')) then
|
||
ok := DelTree(ExpandConstant('{userappdata}\\{{DISPLAY_NAME}}'), True, True, True);
|
||
if DirExists(ExpandConstant('{tmp}\\{{DISPLAY_NAME}}')) then
|
||
ok := DelTree(ExpandConstant('{tmp}\\{{DISPLAY_NAME}}'), True, True, True);
|
||
except
|
||
AppendLog('exception deleting user data');
|
||
end;
|
||
end;
|
||
|
||
function InitializeSetup(): Boolean;
|
||
begin
|
||
TerminateProcesses();
|
||
StopServices();
|
||
Result := True;
|
||
end;
|
||
|
||
procedure CurStepChanged(CurStep: TSetupStep);
|
||
var
|
||
FileName: String;
|
||
ChannelName: String;
|
||
P: Integer;
|
||
begin
|
||
if CurStep = ssPostInstall then
|
||
begin
|
||
// 获取当前安装包的文件名 (例如 Setup_ic-888.exe)
|
||
FileName := ExpandConstant('{srcexe}');
|
||
FileName := ExtractFileName(FileName);
|
||
|
||
// 逻辑:寻找 ic- 标识并提取
|
||
P := Pos('ic-', FileName);
|
||
if P > 0 then
|
||
begin
|
||
// 提取从 ic- 开始到结尾的部分
|
||
ChannelName := Copy(FileName, P, Length(FileName) - P + 1);
|
||
// 去掉 .exe 后缀
|
||
P := Pos('.exe', LowerCase(ChannelName));
|
||
if P > 0 then
|
||
Delete(ChannelName, P, Length(ChannelName));
|
||
|
||
// 在安装目录下生成一个 channel.txt,供 Flutter 读取
|
||
SaveStringToFile(ExpandConstant('{app}\channel.txt'), ChannelName, False);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
function InitializeUninstall(): Boolean;
|
||
begin
|
||
TerminateProcesses();
|
||
StopServices();
|
||
CleanPaths();
|
||
Result := True;
|
||
end;
|