第一次使用可视化界面创建安装程序,之后发现会不断修改安装程序打包逻辑,和覆盖安装等等问题,所以之后我们会通过第一次生成的iss脚本文件 再去做一些定制化操作。
1. 安装时自动填入安装路径(第一次安装,填入默认路径;第二次安装,填入上一次的安装路径)
需要在 [Setup]
段添加 DefaultDirName={code:GetDefaultDir}
在[Code]
段 添加
#define MyAppName "you"
#define MyAppVersion "0.3.4"
#define MyAppExeName "you.exe"
#define IconPath "favicon.ico"
#define AppId ""
[Code]
//为用户添加默认安装路径
function GetDefaultDir(Param: string): string;
var
AppInstalled: Boolean;
InstallLocation: String;
begin
// 根据APPID 查询 注册表是否存在指定值
AppInstalled := RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1');
// 获取注册表 InstallLocation值
RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#AppId}_is1', 'InstallLocation', InstallLocation);
// 如果检测到注册表 存在APPID 相关信息
if AppInstalled and (InstallLocation <> '') then
begin
Result := InstallLocation; // 默认路径
end
else
begin
Result := 'C:\{#MyAppName}'; // 默认路径
end
end;
原理是:程序安装后会自动添加注册表,注册表包含了当前应用的必要信息,比如安装路径、卸载路径等等
所以 可以使用Inno Setup
内置方法RegKeyExists
RegQueryStringValue
来获取应用程序的注册表信息。(前提是得知道当前应用程序的APPID
!所以我们在打包时,最好手动生成一个APPID
。点击【工具】-【生成GUID
】)
如果不知道上一次的APPID 我们可以使用Geek工具 右键你的应用程序点击【注册表条目】可以快速查看注册表中的APPID
#define AppId "2B1F85D1-A223-41DD-A49E-3589" //将生成的APPID放在这里
2. 安装时 如果应用程序正在运行,需要沙掉应用程序
// 杀死进程
procedure onKillProcess;
var
ResultCode: Integer;
begin
Exec('cmd.exe', '/C taskkill /F /IM 你的应用入口.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
function InitializeSetup: Boolean;
begin
onKillProcess;
Result := true;
end;
原理是 在
InitializeSetup
内置函数中 调用onKillProcess
方法 使用Exec
内置函数通过cmd命令 沙进程。
3. 创建桌面快捷方式
在 [Icons]
段 添加
#define MyAppName "you"
#define MyAppVersion "0.3.4"
#define MyAppExeName "you.exe"
#define IconPath "favicon.ico"
#define AppId ""
[Icons]
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; WorkingDir: {app};IconFilename:"{app}\{#IconPath}"
其中需要声明一些变量:
MyAppName
(应用程序名称)
MyAppExeName
(应用程序入口文件)
IconPath
(图标的相对路径IconFilename:"{app}\{#IconPath}"
app代表程序根路径。
4. 安装完成后设置自动运行的问题
在 [Run]
段 添加
#define MyAppName "you"
#define MyAppVersion "0.3.4"
#define MyAppExeName "you.exe"
#define IconPath "favicon.ico"
#define AppId ""
[Run]
Filename: "{app}\{#MyAppExeName}";Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: postinstall runasoriginaluser
添加之后 会在安装完毕后点击安装向导最后一页的运行按钮 启动新安装的应用程序, 如果你的应用需要管理员权限运行 可以尝试 添加
runasoriginaluser
属性,如果不行,也可以选择规避问题 将[Run]
段安装完毕后运行的代码去掉即可 ,安装完毕后 点击完成按钮,需要双击桌面快捷方式启动。
5. 通过 VSCode 启动 Inno Setup(在生成安装程序完毕后自动启动 Inno Setup 开始打包)
const { spawn } = require('child_process');
//第一个路径 是Inno Setup的安装路径 第二个路径是自定义的Inno Setup iss脚本文件路径
spawn('D:/soft/Inno Setup 6/Compil32.exe', [path.resolve('./ShanHe32.iss')], {
stdio: ['pipe', 'inherit', 'inherit'], // 将子进程的标准输入流传递给父进程
});