2025-08-15 11:47:44 +08:00
|
|
|
|
;iss
|
|
|
|
|
|
|
|
|
|
#define MyAppName "基础环境"
|
|
|
|
|
#define MyAppVersion "v1.0.0"
|
|
|
|
|
#define MyAppPublisher "X"
|
|
|
|
|
#define MyAppURL "~"
|
|
|
|
|
#define MyAppExeName "command"
|
2025-08-17 18:52:13 +08:00
|
|
|
|
#define MyAppExeNameHump "Command"
|
|
|
|
|
#define MyAppExeNameUpper "COMMAND"
|
2025-08-15 11:47:44 +08:00
|
|
|
|
#define MyAppAssocName MyAppName + " File"
|
|
|
|
|
#define MyAppAssocExt ".myp"
|
|
|
|
|
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; 默认配置
|
|
|
|
|
[Setup]
|
2025-08-15 15:43:00 +08:00
|
|
|
|
; 不得复用,每个应用必须有唯一AppId
|
2025-08-15 11:47:44 +08:00
|
|
|
|
AppId={{517C2278-C7C9-43D0-8E94-BFD2039C7BB8}
|
|
|
|
|
; 默认安装路径
|
|
|
|
|
DefaultDirName={localappdata}\XManage
|
|
|
|
|
; 是否加密
|
|
|
|
|
;Encryption=yes
|
|
|
|
|
; 安装密码
|
|
|
|
|
;Password=20250801
|
|
|
|
|
; ICO图标
|
|
|
|
|
; SetupIconFile=Resources\startup.ico
|
|
|
|
|
UninstallFilesDir={app}
|
|
|
|
|
UninstallDisplayIcon={app}\{#MyAppExeName}.exe
|
|
|
|
|
VersionInfoCompany=
|
|
|
|
|
VersionInfoCopyright=CopyRight © 2025
|
|
|
|
|
VersionInfoDescription=
|
|
|
|
|
VersionInfoProductVersion=1.0.0
|
|
|
|
|
VersionInfoProductName=基础环境(支持Windows7及以上)
|
|
|
|
|
|
|
|
|
|
; 默认配置
|
|
|
|
|
AppName={#MyAppName}
|
|
|
|
|
AppVersion={#MyAppVersion}
|
|
|
|
|
AppPublisher={#MyAppPublisher}
|
|
|
|
|
AppPublisherURL={#MyAppURL}
|
|
|
|
|
AppSupportURL={#MyAppURL}
|
|
|
|
|
AppUpdatesURL={#MyAppURL}
|
|
|
|
|
ChangesAssociations=yes
|
|
|
|
|
DisableDirPage=no
|
2025-08-15 15:37:52 +08:00
|
|
|
|
DisableProgramGroupPage=yes
|
2025-08-15 11:47:44 +08:00
|
|
|
|
Compression=lzma2
|
|
|
|
|
SolidCompression=yes
|
|
|
|
|
WizardStyle=modern
|
|
|
|
|
ChangesEnvironment=yes
|
|
|
|
|
PrivilegesRequired=admin
|
|
|
|
|
ArchitecturesAllowed=x64compatible
|
|
|
|
|
ArchitecturesInstallIn64BitMode=x64compatible
|
|
|
|
|
OutputDir=Release\
|
|
|
|
|
OutputBaseFilename=Setup-{#MyAppVersion}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; 语言选择
|
|
|
|
|
[Languages]
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Name: "Chinese"; MessagesFile: "compiler:Languages\Chinese.isl";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 任务
|
|
|
|
|
[Tasks]
|
|
|
|
|
; 是否创建桌面图标
|
|
|
|
|
;Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;; 程序 ICO
|
|
|
|
|
[Icons]
|
|
|
|
|
;Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"
|
|
|
|
|
;Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}.exe"; Tasks: desktopicon
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 11:47:44 +08:00
|
|
|
|
;; 组件安装方式
|
|
|
|
|
[Types]
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Name: "full"; Description: "完整组件安装";
|
|
|
|
|
Name: "mini"; Description: "最小安装";
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;; ============================================== 自定义组件 必须启用 iscustom 作为 Flags ==============================================
|
2025-08-15 15:37:52 +08:00
|
|
|
|
; iscustom 开启自定义选项
|
|
|
|
|
Name: "custom"; Description: "自定义组件安装"; Flags: iscustom;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 组件列表选择项
|
|
|
|
|
[Components]
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;; ============================================== 自定义组件的 Types 可以不参与任何固定式 ==============================================
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Name: "MainApp"; Description: "{#MyAppName}主程序"; Types: full mini; Flags: checkablealone;
|
2025-08-17 12:37:05 +08:00
|
|
|
|
Name: "JDK"; Description: "JDK程序"; Types: full; Flags: checkablealone;
|
|
|
|
|
Name: "Redis"; Description: "Redis程序"; Types: full; Flags: checkablealone;
|
|
|
|
|
Name: "MinIO"; Description: "MinIO程序"; Types: full; Flags: checkablealone;
|
|
|
|
|
Name: "RocketMQ"; Description: "RocketMQ程序"; Types: full; Flags: checkablealone;
|
|
|
|
|
Name: "Nginx"; Description: "Nginx程序"; Types: full; Flags: checkablealone;
|
|
|
|
|
Name: "MySQL"; Description: "MySQL程序"; Types: full; Flags: checkablealone;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 引入文件列表
|
|
|
|
|
[Files]
|
2025-08-17 12:37:05 +08:00
|
|
|
|
|
|
|
|
|
;; ============================================== 共享文件 禁止使用 ignoreversion 作为 Flags ==============================================
|
2025-08-15 11:47:44 +08:00
|
|
|
|
;; Readme
|
2025-08-15 15:37:52 +08:00
|
|
|
|
; 安装完的 readme 信息
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;Source: "Resources\Readme.md"; DestDir: "{app}"; Flags: isreadme;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
;; 文件
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Source: "Resources\grep.exe"; DestDir: "{app}\usr"; DestName: "grep.exe"; Flags: ignoreversion; Components: MainApp;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
;; 文件夹
|
2025-08-15 15:37:52 +08:00
|
|
|
|
; recursesubdirs createallsubdirs 递归复制整个目录
|
|
|
|
|
Source: "Resources\usr\*"; DestDir: "{app}\usr\"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: MainApp;
|
|
|
|
|
; onlyifdoesntexist 当文件不存在时安装
|
|
|
|
|
Source: "Resources\jdk\*"; DestDir: "{app}\jdk\"; Flags: ignoreversion recursesubdirs createallsubdirs onlyifdoesntexist; Components: JDK;
|
|
|
|
|
Source: "Resources\redis\*"; DestDir: "{app}\redis\"; Flags: onlyifdoesntexist recursesubdirs createallsubdirs; Components: Redis;
|
|
|
|
|
Source: "Resources\io\*"; DestDir: "{app}\io\"; Flags: onlyifdoesntexist recursesubdirs createallsubdirs; Components: MinIO;
|
|
|
|
|
Source: "Resources\rocketmq\*"; DestDir: "{app}\rocketmq\"; Flags: onlyifdoesntexist recursesubdirs createallsubdirs; Components: RocketMQ;
|
|
|
|
|
Source: "Resources\nginx\*"; DestDir: "{app}\nginx\"; Flags: onlyifdoesntexist recursesubdirs createallsubdirs; Components: Nginx;
|
|
|
|
|
Source: "Resources\mysql\*"; DestDir: "{app}\mysql\"; Flags: onlyifdoesntexist recursesubdirs createallsubdirs; Components: MySQL;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 创建必要目录
|
|
|
|
|
[Dirs]
|
2025-08-17 12:56:44 +08:00
|
|
|
|
Name: "{app}\nginx\logs"; Permissions: users-modify; Components: Nginx;
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Name: "{app}\nginx\dist"; Permissions: users-modify; Components: Nginx;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 安装前后删除文件
|
|
|
|
|
[InstallDelete]
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;Type: files; Name: "{app}\mysql\template.ini";
|
|
|
|
|
;Type: files; Name: "{app}\mysql\template-initialize-and-start-mysql.bat";
|
|
|
|
|
;Type: files; Name: "{app}\mysql\template-register-mysql-with-data.bat";
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 安装时注册表与环境变量列表
|
|
|
|
|
[Registry]
|
2025-08-15 15:37:52 +08:00
|
|
|
|
; uninsdeletevalue 卸载时删除值
|
|
|
|
|
; uninsdeletekey 卸载时删除键
|
|
|
|
|
; preservestringtype 保留原值类型
|
2025-08-17 04:32:18 +08:00
|
|
|
|
;; ============================================== Path 禁止使用任何 *delete*、*remove* 作为 Flags 运行 ==============================================
|
|
|
|
|
|
|
|
|
|
;; 写入普通注册表项
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Root: HKLM; Subkey: "Software\X\Command"; ValueType: string; ValueName: "InstallPath"; ValueData: "{app}"; Flags: uninsdeletevalue ;
|
|
|
|
|
Root: HKLM; Subkey: "Software\X\Command"; ValueType: string; ValueName: "Version"; ValueData: "{#SetupSetting("AppVersion")}"; Flags: uninsdeletevalue ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 默认注册信息
|
|
|
|
|
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocExt}\OpenWithProgids"; ValueType: string; ValueName: "{#MyAppAssocKey}"; ValueData: ""; Flags: uninsdeletevalue;
|
|
|
|
|
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}"; ValueType: string; ValueName: ""; ValueData: "{#MyAppAssocName}"; Flags: uninsdeletevalue;
|
|
|
|
|
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\{#MyAppExeName}.exe,0"; Flags: uninsdeletevalue;
|
|
|
|
|
Root: HKA; Subkey: "Software\Classes\{#MyAppAssocKey}\shell\open\command"; ValueType: string; ValueName: ""; ValueData: """{app}\{#MyAppExeName}.exe"" ""%1"""; Flags: uninsdeletevalue;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【grep、awk、sed、head、sort、ls、rm、xargs、rar、zip、tar、md5sum、sha1sum...】
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MainApp; \
|
|
|
|
|
ValueName: "X_COMMAND"; ValueData: "{app}"; Flags: uninsdeletevalue ;
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: MainApp; \
|
2025-08-17 04:32:18 +08:00
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\usr"; Check: NeedsAddPath('%X_COMMAND%\usr'); Flags: preservestringtype ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【Java】追加到 PATH 变量
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: JDK; \
|
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%JAVA_HOME%\bin"; Check: NeedsAddPath('%JAVA_HOME%\bin'); Flags: preservestringtype;
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: JDK; \
|
|
|
|
|
ValueName: "JAVA_HOME"; ValueData: "{app}\jdk"; Flags: uninsdeletevalue ;
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: JDK; \
|
|
|
|
|
ValueName: "JDK_21"; ValueData: "{app}\jdk"; Flags: uninsdeletevalue ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【Redis】追加到 PATH 变量
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: Redis; \
|
2025-08-17 04:32:18 +08:00
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\redis"; Check: NeedsAddPath('%X_COMMAND%\redis'); Flags: preservestringtype ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【MinIO】追加到 PATH 变量
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: MinIO; \
|
2025-08-17 04:32:18 +08:00
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\io"; Check: NeedsAddPath('%X_COMMAND%\io'); Flags: preservestringtype ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【Nginx】追加到 PATH 变量
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: Nginx; \
|
2025-08-17 04:32:18 +08:00
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND%\nginx"; Check: NeedsAddPath('%X_COMMAND%\nginx'); Flags: preservestringtype ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【RocketMQ】追加到 PATH 变量
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: RocketMQ; \
|
|
|
|
|
ValueName: "ROCKETMQ_HOME"; ValueData: "{app}\rocketmq"; Check: CheckRegistryPath('{app}\rocketmq'); Flags: uninsdeletevalue ;
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: RocketMQ; \
|
|
|
|
|
ValueName: "ROCKETMQ_SBIN"; ValueData: "{app}\rocketmq\sbin"; Flags: uninsdeletevalue ;
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: RocketMQ; \
|
2025-08-17 04:32:18 +08:00
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%ROCKETMQ_SBIN%"; Check: NeedsAddPath('%ROCKETMQ_SBIN%'); Flags: preservestringtype ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
;; 【MySQL】环境变量【注册服务使用】
|
2025-08-15 11:47:44 +08:00
|
|
|
|
; 数据库服务注册后服务名
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
2025-08-15 15:37:52 +08:00
|
|
|
|
ValueName: "X_MANAGE_DB_SC"; ValueData: "x_database"; Flags: uninsdeletevalue ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
; 这两个值,将作为后续判断程序是否已经安装做依据
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
2025-08-15 15:37:52 +08:00
|
|
|
|
ValueName: "X_MANAGE_DB_EXE"; ValueData: "{app}\mysql\bin\mysqld.exe"; Flags: uninsdeletevalue ;
|
2025-08-17 12:37:05 +08:00
|
|
|
|
;Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
2025-08-15 15:37:52 +08:00
|
|
|
|
ValueName: "X_MANAGE_DB_COF"; ValueData: "{app}\mysql\my.ini"; Flags: uninsdeletevalue ;
|
|
|
|
|
|
|
|
|
|
; MySQL【通用服务】,导入脚本数据使用
|
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: string; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
|
|
|
|
ValueName: "X_COMMAND_MYSQL"; ValueData: "{app}\mysql\"; Flags: uninsdeletevalue ;
|
2025-08-15 11:47:44 +08:00
|
|
|
|
; 追加到 PATH 变量
|
2025-08-15 15:37:52 +08:00
|
|
|
|
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; ValueType: expandsz; AfterInstall: RefreshEnvironment; Components: MySQL; \
|
|
|
|
|
ValueName: "Path"; ValueData: "{olddata};%X_COMMAND_MYSQL%\bin"; Check: NeedsAddPath('%X_COMMAND_MYSQL%\bin'); Flags: uninsdeletevalue ;
|
|
|
|
|
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 自定义函数
|
|
|
|
|
[Code]
|
|
|
|
|
|
|
|
|
|
const
|
|
|
|
|
WM_SETTINGCHANGE = 26; // 0x001A 的十进制
|
|
|
|
|
SMTO_ABORTIFHUNG = 2; // 0x0002 的十进制
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
// 定义 VC++ 2019 运行时的注册表检查路径
|
|
|
|
|
VC2019_REDIST_X64 = '{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}';
|
|
|
|
|
VC2019_REDIST_X86 = '{422B21A3-06FA-3F2F-A6C6-21BCC9B8E2F3}';
|
2025-08-15 11:47:44 +08:00
|
|
|
|
|
|
|
|
|
function SendMessageTimeout(
|
|
|
|
|
hWnd: Integer;
|
|
|
|
|
Msg: Integer;
|
|
|
|
|
wParam: Integer;
|
|
|
|
|
lParamStr: String;
|
|
|
|
|
fuFlags: Integer;
|
|
|
|
|
uTimeout: Integer;
|
|
|
|
|
var lpdwResult: Integer
|
|
|
|
|
): Integer;
|
|
|
|
|
external 'SendMessageTimeoutW@user32.dll stdcall';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 给 Path 系统环境变量追加环境
|
|
|
|
|
function NeedsAddPath(Param: string): boolean;
|
|
|
|
|
var
|
|
|
|
|
OrigPath: string;
|
|
|
|
|
begin
|
|
|
|
|
if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
|
|
|
|
|
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
|
|
|
|
|
'Path', OrigPath)
|
|
|
|
|
then begin
|
|
|
|
|
Result := True;
|
|
|
|
|
exit;
|
|
|
|
|
end;
|
|
|
|
|
// 检查路径是否已存在
|
|
|
|
|
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
|
|
|
|
|
if Result = True then
|
|
|
|
|
Result := Pos(';' + Param + '\;', ';' + OrigPath + ';') = 0;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 刷新系统环境
|
|
|
|
|
procedure RefreshEnvironment;
|
|
|
|
|
var
|
|
|
|
|
Res: Integer;
|
|
|
|
|
begin
|
|
|
|
|
SendMessageTimeout(
|
|
|
|
|
HWND_BROADCAST,
|
|
|
|
|
WM_SETTINGCHANGE,
|
|
|
|
|
0,
|
|
|
|
|
'Environment',
|
|
|
|
|
SMTO_ABORTIFHUNG,
|
|
|
|
|
5000,
|
|
|
|
|
Res
|
|
|
|
|
);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 检查环境变量,路径是否存在空格
|
|
|
|
|
function CheckRegistryPath(Path: string): Boolean;
|
|
|
|
|
begin
|
|
|
|
|
if Pos(' ', Path) > 0 then
|
|
|
|
|
begin
|
|
|
|
|
SuppressibleMsgBox('安装程序错误: 检测到无效的注册表路径 "' + Path + '"。路径不能包含空格。', mbCriticalError, MB_OK, IDOK);
|
|
|
|
|
Abort;
|
|
|
|
|
Result := False;
|
|
|
|
|
Exit;
|
|
|
|
|
end;
|
|
|
|
|
Result := True;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 以 UTF-8 写入文件
|
|
|
|
|
function SaveStringToUTF8File(const FileName, Content: String; Append: Boolean): Boolean;
|
|
|
|
|
var
|
|
|
|
|
UTF8Content: AnsiString;
|
|
|
|
|
begin
|
|
|
|
|
UTF8Content := UTF8Encode(Content);
|
|
|
|
|
Result := SaveStringToFile(FileName, UTF8Content, Append);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
// 检查是否已安装 VC++ 2019 运行时
|
|
|
|
|
function IsVC2019Installed: Boolean;
|
|
|
|
|
var
|
|
|
|
|
Version: String;
|
|
|
|
|
begin
|
|
|
|
|
// 检查64位版本
|
|
|
|
|
Result := RegQueryStringValue(
|
|
|
|
|
HKLM,
|
|
|
|
|
'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64',
|
|
|
|
|
'Version',
|
|
|
|
|
Version
|
|
|
|
|
) or RegKeyExists(
|
|
|
|
|
HKLM,
|
|
|
|
|
'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X64
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// 如果是32位系统或需要检查32位运行时
|
|
|
|
|
if not Result and (not IsWin64) then
|
|
|
|
|
Result := RegQueryStringValue(
|
|
|
|
|
HKLM,
|
|
|
|
|
'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86',
|
|
|
|
|
'Version',
|
|
|
|
|
Version
|
|
|
|
|
) or RegKeyExists(
|
|
|
|
|
HKLM,
|
|
|
|
|
'SOFTWARE\Classes\Installer\Dependencies\' + VC2019_REDIST_X86
|
|
|
|
|
);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 11:47:44 +08:00
|
|
|
|
// 从模板创建配置文件
|
|
|
|
|
procedure CreateConfigFromTemplate;
|
|
|
|
|
var
|
|
|
|
|
// ini
|
|
|
|
|
TemplateIniPath: String;
|
|
|
|
|
TargetIniPath: String;
|
|
|
|
|
// initial
|
|
|
|
|
TemplateInitialPath: String;
|
|
|
|
|
TargetInitialPath: String;
|
|
|
|
|
// register
|
|
|
|
|
TemplateRegisterPath: String;
|
|
|
|
|
TargetRegisterPath: String;
|
|
|
|
|
// handle params
|
|
|
|
|
ConfigLines: TArrayOfString;
|
|
|
|
|
I: Integer;
|
|
|
|
|
ReplaceCount: Integer;
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
|
|
// generate my.ini
|
|
|
|
|
TemplateIniPath := ExpandConstant('{app}\mysql\template.ini');
|
|
|
|
|
TargetIniPath := ExpandConstant('{app}\mysql\my.ini');
|
|
|
|
|
|
|
|
|
|
if LoadStringsFromFile(TemplateIniPath, ConfigLines) then
|
|
|
|
|
begin
|
|
|
|
|
for I := 0 to GetArrayLength(ConfigLines)-1 do
|
|
|
|
|
begin
|
|
|
|
|
StringChangeEx(ConfigLines[I], '%INSTALLPATH%', ExpandConstant('{app}\mysql'), True);
|
|
|
|
|
StringChangeEx(ConfigLines[I], '%DATAPATH%', ExpandConstant('{app}\mysql\data'), True);
|
|
|
|
|
StringChangeEx(ConfigLines[I], '\', '\\', True);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
SaveStringsToFile(TargetIniPath, ConfigLines, False);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// generate initialize-and-start-mysql.bat
|
|
|
|
|
TemplateInitialPath := ExpandConstant('{app}\mysql\template-initialize-and-start-mysql.bat');
|
|
|
|
|
TargetInitialPath := ExpandConstant('{app}\mysql\initialize-and-start-mysql.bat');
|
|
|
|
|
|
|
|
|
|
if LoadStringsFromFile(TemplateInitialPath, ConfigLines) then
|
|
|
|
|
begin
|
|
|
|
|
for I := 0 to GetArrayLength(ConfigLines)-1 do
|
|
|
|
|
begin
|
|
|
|
|
StringChangeEx(ConfigLines[I], '%INSTALLPATH%', ExpandConstant('{app}\mysql'), True);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
SaveStringsToFile(TargetInitialPath, ConfigLines, False);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// generate register-mysql-with-data.bat
|
|
|
|
|
TemplateRegisterPath := ExpandConstant('{app}\mysql\template-register-mysql-with-data.bat');
|
|
|
|
|
TargetRegisterPath := ExpandConstant('{app}\mysql\register-mysql-with-data.bat');
|
|
|
|
|
|
|
|
|
|
if LoadStringsFromFile(TemplateRegisterPath, ConfigLines) then
|
|
|
|
|
begin
|
|
|
|
|
for I := 0 to GetArrayLength(ConfigLines)-1 do
|
|
|
|
|
begin
|
|
|
|
|
StringChangeEx(ConfigLines[I], '%INSTALLPATH%', ExpandConstant('{app}\mysql'), True);
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
SaveStringsToFile(TargetRegisterPath, ConfigLines, False);
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 15:37:52 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 在安装前检查
|
|
|
|
|
function InitializeSetup: Boolean;
|
|
|
|
|
begin
|
|
|
|
|
// 默认允许安装继续
|
|
|
|
|
Result := True;
|
|
|
|
|
// 如果 VC++ 2019 未安装
|
|
|
|
|
if not IsVC2019Installed then
|
|
|
|
|
begin
|
|
|
|
|
MsgBox('本程序需要 Microsoft Visual C++ 2019 运行时才能继续(1001)', mbError, MB_OK)
|
|
|
|
|
// 中止安装
|
|
|
|
|
Result := False;
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
2025-08-15 11:47:44 +08:00
|
|
|
|
// 在安装完成后执行
|
|
|
|
|
procedure CurStepChanged(CurStep: TSetupStep);
|
2025-08-17 12:37:05 +08:00
|
|
|
|
begin
|
|
|
|
|
// 仅在安装完成后执行
|
2025-08-15 11:47:44 +08:00
|
|
|
|
if CurStep = ssPostInstall then
|
|
|
|
|
begin
|
|
|
|
|
CreateConfigFromTemplate;
|
|
|
|
|
|
2025-08-17 12:37:05 +08:00
|
|
|
|
if FileExists(ExpandConstant('{app}\mysql\template.ini')) then
|
|
|
|
|
DeleteFile(ExpandConstant('{app}\mysql\template.ini'));
|
|
|
|
|
|
|
|
|
|
if FileExists(ExpandConstant('{app}\mysql\template-initialize-and-start-mysql.bat')) then
|
|
|
|
|
DelTree(ExpandConstant('{app}\mysql\template-initialize-and-start-mysql.bat'), False, True, False);
|
|
|
|
|
if FileExists(ExpandConstant('{app}\mysql\template-register-mysql-with-data.bat')) then
|
|
|
|
|
DelTree(ExpandConstant('{app}\mysql\template-register-mysql-with-data.bat'), False, True, False);
|
2025-08-15 11:47:44 +08:00
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 卸载前先停止程序运行
|
|
|
|
|
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
|
|
|
|
|
begin
|
|
|
|
|
if CurUninstallStep = usUninstall then begin
|
|
|
|
|
// 在这里执行你的脚本或程序
|
|
|
|
|
// Exec(ExpandConstant('{cmd}'), '/C "uninstall_script.bat"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
|
|
|
|
|
end;
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[UninstallRun]
|
|
|
|
|
;; 卸载前运行
|
|
|
|
|
Filename: "sc"; Parameters: "stop redis"; Flags: runascurrentuser runhidden waituntilterminated
|
|
|
|
|
Filename: "sc"; Parameters: "delete redis"; Flags: runascurrentuser runhidden waituntilterminated
|
|
|
|
|
Filename: "sc"; Parameters: "stop x_database"; Flags: runascurrentuser runhidden waituntilterminated
|
|
|
|
|
Filename: "sc"; Parameters: "delete x_database"; Flags: runascurrentuser runhidden waituntilterminated
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;; 卸载时删除的文件
|
|
|
|
|
[UninstallDelete]
|
|
|
|
|
Type: files; Name: "{app}\mysql\my.ini"
|
|
|
|
|
Type: files; Name: "{app}\mysql\*.bat"
|
|
|
|
|
Type: filesandordirs; Name: "{app}\mysql\data"
|