原创

使用Inno Setup制作专业级Windows安装包

温馨提示:
本文最后更新于 2025年03月31日,已超过 19 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

 

一.Inno Setup

Inno Setup 是一个免费的 Windows 程序安装包制作工具,它允许开发者创建专业级的安装程序。使用 Inno Setup,您可以为您的应用程序定义安装和卸载过程,包括文件复制、快捷方式创建、注册表修改等操作。

1.1安装

从官网下载Inno Setup软件,地址:https://files.jrsoftware.org/is/6/

1.2增加简体中文安装语言

进入InnoSetup根目录下的Languages文件夹,创建文件Chinese.isl。内容为以下文本,内容来源打开地址https://jrsoftware.org/files/istrans/。然后制作安装包的时候,就可以选中简体中文语言了。

二.使用C#编写主可执行文件

using System;
using System.Diagnostics;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string htmlFilePath = @"C:\Meeting\无纸化会议系统.html";

        if (File.Exists(htmlFilePath))
        {
            OpenFile(htmlFilePath);
        }
        else
        {
            Console.WriteLine($"{htmlFilePath} 文件不存在。");
        }
    }

    static void OpenFile(string filePath)
    {
        try
        {
            // 使用Process.Start直接打开文件,系统会根据文件类型调用相应的程序,默认是浏览器对于HTML文件
            Process.Start(new ProcessStartInfo(filePath) { UseShellExecute = true });
        }
        catch (Exception ex)
        {
            Console.WriteLine($"无法打开文件: {ex.Message}");
        }
    }
}

三.制作安装包

1.新建打包项目

2.点击下一步

3.填写软件名称、软件版本、发行公司信息、软件地址

4.设置应用程序根目录和应用程序目录名

5.配置应用程序主可执行文件,添加需要打包的文件

6.配置应用程序文件关联,点击下一步

7.配置应用程序快捷方式,默认选中

  • 在“开始”菜单程序文件夹中创建主可执行文件的快捷方式
  • 允许用户创建桌面快捷方式

8.应用程序文档,配置许可文件、安装之前显示的信息文件、安装之后显示的信息文件。

9.安装模式设置,默认选中

  • 管理员安装模式(为所有用户安装)

10.应用程序注册表键和值,点击下一步。

11.安装程序语言,选中English和Chinese。

12.编译器设置,配置编译后安装包的输出文件夹位置、输出文件名、自定义安装程序图标。

13.点击下一步

14.完成

15.是否立即编译新的脚本。

16.是否保存script脚本信息。

17.等待编译完成。

18.安装编译好的软件,安装成功后效果如下。

 

四.进阶功能

4.1生成多个桌面快捷方式

.iss脚本文件的[Icons]部分,可以通过以下方式添加多个快捷方式。 这里的Tasks: desktopicon意味着只有当用户选择了创建桌面快捷方式的任务时,这些快捷方式才会被创建。

Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: "{autodesktop}\Video_Server"; Filename: "{app}\Socket\Video_Server.exe"; Tasks: desktopicon

4.2执行脚本和exe程序

在 [Setup] 段中设置 PrivilegesRequired=admin,确保整个安装过程以管理员权限运行

[Setup]
...
PrivilegesRequired=admin
...

由于[Run]部分中的条目通常是在安装完成之后执行的,我们需要使用[Code]段来实现更灵活的控制流。

[Run]
...

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if CurStep = ssPostInstall then
  begin
    // 执行 install.bat 脚本(需要管理员权限)
    if not Exec(ExpandConstant('{app}\install.bat'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
    begin
      MsgBox('Failed to execute install.bat', mbError, MB_OK);
    end;

    // 使用ShellExec以当前用户权限执行MachineControl.exe
    if FileExists(ExpandConstant('{app}\SerialPort\MachineControl.exe')) then
    begin
      if not ShellExec('open', ExpandConstant('{app}\SerialPort\MachineControl.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
      begin
        MsgBox('Failed to execute MachineControl.exe', mbError, MB_OK);
      end;
    end else
    begin
      MsgBox('MachineControl.exe not found', mbError, MB_OK);
    end;

    // 使用ShellExec以当前用户权限执行网络开关机控制程序.exe
    if FileExists(ExpandConstant('{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe')) then
    begin
      if not ShellExec('open', ExpandConstant('{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ResultCode) then
      begin
        MsgBox('Failed to execute 网络开关机控制程序.exe', mbError, MB_OK);
      end;
    end else
    begin
      MsgBox('网络开关机控制程序.exe not found', mbError, MB_OK);
    end;
  end;
end;

 

4.3开机启动指定程序

利用[Registry]段落来设置注册表键值,实现指定程序的开机启动。Windows操作系统会在每次启动时检查特定的注册表位置,以确定哪些应用程序需要自动启动。

[Registry]
; 设置start.bat为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "startBat"; ValueData: """{app}\start.bat"""; Flags: uninsdeletevalue
; 设置MachineControl.exe为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "MachineControlExe"; ValueData: """{app}\SerialPort\MachineControl.exe"""; Flags: uninsdeletevalue
; 设置网络开关机控制程序.exe为开机启动
Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; ValueType: string; ValueName: "网络开关机控制程序Exe"; ValueData: """{app}\网络开关机控制程序2.0.0\网络开关机控制程序.exe"""; Flags: uninsdeletevalue

 

正文到此结束