Inno Setup项目复盘经验分享

第一次使用可视化界面创建安装程序,之后发现会不断修改安装程序打包逻辑,和覆盖安装等等问题,所以之后我们会通过第一次生成的iss脚本文件 再去做一些定制化操作。

1. 安装时自动填入安装路径(第一次安装,填入默认路径;第二次安装,填入上一次的安装路径)

需要在 [Setup]段添加 DefaultDirName={code:GetDefaultDir}
Inno Setup项目复盘经验分享_第1张图片
[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】)
Inno Setup项目复盘经验分享_第2张图片
如果不知道上一次的APPID 我们可以使用Geek工具 右键你的应用程序点击【注册表条目】可以快速查看注册表中的APPID
Inno Setup项目复盘经验分享_第3张图片

#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'], // 将子进程的标准输入流传递给父进程
});
使用Inno Setup打包应用程序,需要学习 Pascal 脚本语言的语法,和Inno Setup 自带的一些很实用的API和钩子函数,祝大家游戏愉快。

你可能感兴趣的:(前端笔记,前端)