Inno Setup教程

ISS文件结构

//宏定义段

[Setup]

[Types]

[Components]

[Tasks]

[Dirs]

[Files]

[Icons]

[INI]

[Languages]

[Messages]

[CustomMessages]

[LangOptions]

[Registry]

[Run]

[UninstallDelete]

[UninstallRun]

[Code]

宏定义

一般再文件开头会添加一些宏定义,此处宏定义一般是为了后续脚本的复用

#define MyAppName "MyApp"
#define MyVersion "3.2.5.872"
#define MyAppVersion MyVersion + "_20240306#标准版"
#define MyAppRuntimeVersion "0.1.23_20230831"
#define MyAppPublisher "Publisher, Inc."
#define MyAppExeName "Server.exe"
#define MyAppAssocName MyAppName + " File"
#define MyAppAssocExt ""
#define MyAppAssocKey StringChange(MyAppAssocName, " ", "") + MyAppAssocExt
#define BasePath "E:\部署环境\app\server"
#define CodeMeterRuntimeRegPath "SOFTWARE\WIBU-SYSTEMS\CodeMeter"
#define CodeMeterRuntimeRegValuePath "RuntimeVersion"
#define MSRuntimeRegPath "SOFTWARE\Classes\Applications\SoundIAppServer.exe\app"
#define MSRuntimeRegValuePath "MSRuntime"
#define MyCompany="xxxx科技有限公司"
#define MyProductName="AppServer"
#define MyAppCopyright="Copyright © 2024 xxx ALL rights reserved."

[Setup]

包含安装程序和卸载程序使用的全局设置

//每个安装程序的AppId都不同,用于区分不同的程序
AppId={{29ee33a2-d9a5-11c5-4ad5-3f40594274f5}
//应用程序名称
AppName={#MyAppName}
//应用程序版本
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
//默认安装路径,
DefaultDirName={autopf}\{#MyAppName}
//安装/卸载后刷新文件关联信息
ChangesAssociations=yes
//安装程序将不显示“选择开始菜单文件夹”向导页
DisableProgramGroupPage=yes
//安装包输出目录路径
OutputDir={#BasePath}\release\AppSetup_{#MyAppVersion}
//安装文件名称
OutputBaseFilename=AppV3ServerSetup_{#MyAppVersion}
//压缩算法,基于压缩率和压缩/解压缩速度权衡,推荐zip算法
Compression=zip
//是否启用固态压缩(将所有文件进行一次压缩,提升压缩率),默认no
SolidCompression=yes
//安装程序外观风格,默认classic 
WizardStyle=modern
//以管理员权限安装
PrivilegesRequired=admin
//对于安装包大小大于2,100,000,000 bytesd(2GB)的情况下,需要开启该选项,将生成一个setup.exe以及多个bin文件,分片
DiskSpanning=yes
//安装包的图标
SetupIconFile=E:\部署环境\app\server\256.ico
//鼠标悬浮-文件版本
VersionInfoVersion={#MyVersion}
//鼠标悬浮-公司信息
VersionInfoCompany={#MyCompany}
//鼠标悬浮-程序版本
VersionInfoProductVersion={#MyVersion}
//鼠标悬浮-程序名称
VersionInfoProductName={#MyProductName}
//鼠标悬浮-版权
AppCopyright={#MyAppCopyright}

[Types]

定义了安装程序将显示在向导的选择组件页面上的所有安装类型,如下图所示,一般用于自定义安装,与[Components]段配合使用

[Types]
Name: "full"; Description: "完整安装所有组件"
Name: "onlyInstallClient"; Description: "仅安装客户端"
Name: "onlyInstallServer ";Description:"仅安装服务端"; 
Name: "custom ";Description:"自定义安装组件"; Flags: iscustom

Flags

iscustom

指示安装程序该类型是自定义类型。每当最终用户在安装过程中手动更改组件选择时,安装程序都会将安装类型设置为自定义类型。注意,如果不定义自定义类型,安装程序将只允许用户选择安装类型,他们不能再手动选择/取消选择组件。

效果展示

在这里插入图片描述

[Components]

定义了安装程序将显示在安装类型自定义向导的选择组件页面上的所有组件

[Components]
Name: "main"; Description: "系统运行的最小单元"; Types: full custom; Flags: fixed
Name: "main\client"; Description: "客户端"; Types: full onlyInstallClient custom; Flags: fixed
Name: "main\server"; Description: "服务端"; Types: full onlyInstallServer custom; Flags: fixed
Name: "tools"; Description: "维护系统的工具"; Types: full
Name: "tools\backups"; Description: "数据备份工具"; Types: full
Name: "tools\logsExport"; Description: "日志导出工具"; Types: full

效果展示

在这里插入图片描述

在这里插入图片描述

[Tasks]

安装程序在安装过程中将执行的所有用户可选任务

[Tasks]
Name: "resetDateDir"; Description: "重新选择数据存储目录"; GroupDescription: "修改配置信息:";
Name: "resetServerHost"; Description: "重新选择案件服务地址"; GroupDescription: "修改配置信息:";
Name: "autoBackupCases"; Description: "安装前自动备份案件数据"; GroupDescription: "案件数据:"; Components: tools\backups
Name: "autoRestoreCases"; Description: "安装后自动恢复案件数据"; GroupDescription: "案件数据:"; Components: tools\backups

Components

关联的组件,只有用户在上一步选择了该组件,这一步才会展示该任务。例如,用户在上一步没有选择“数据备份工具”,则不展示"安装前自动备份案件数据"及"安装后自动恢复案件数据"

Flags

exclusive

​ 标志位表示与统计其他任务互斥,例如以下情况

[Tasks]
Name: "restart"; Description: "安装完成后自动重启电脑"; Flags:exclusive 
Name: "autoOpenClient"; Description: "安装完成后自动打开客户端"; Flags:exclusive

在这里插入图片描述

[Dirs]

定义安装程序除了用户选择的应用程序目录(该目录是自动创建的)之外要创建的任何其他目录

[Dirs]
Name: "{app}\data"
Name: "{app}\bin"

Attribs

指定目录的其他属性。readonly, hidden, system, notcontentindexed

Flags

deleteafterinstall

​ 如果安装之前目录不存在,且安装完成(或中止)后目录为空,则在安装完成(或中止)后将其删除。

uninsalwaysuninstall

​ 安装完成(或中止)后目录为空,则在安装完成(或中止)后将其删除。

uninsneveruninstall

​ 卸载程序不删除目录。默认情况下,如果[ Dirs ]部分中指定的目录为空,卸载程序将删除该目录。

[Files]

安装程序要安装在用户系统上的文件。

[Files]
Source: "{#BasePath}\SoundIDorServer.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BasePath}\SoundIDorServerBase.xml"; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: ChangeServerRunXmlConfig
Source: "{#BasePath}\dor-server.jar"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#BasePath}\jre\*"; DestDir: "{app}\jre"; Flags: ignoreversion recursesubdirs createallsubdirs

DestName

此参数指定文件在用户系统上安装时的新名称。默认情况下,安装程序使用 Source 参数中的名称,因此在大多数情况下不需要指定此参数。

Excludes

指定要排除的模式列表,以逗号分隔。此参数不能与 external 组合。

Source: "{#BasePath}\jre\*"; DestDir: "{app}\jre"; Excludes: "*.txt"; Flags: ignoreversion recursesubdirs createallsubdirs

Attribs

同[Dirs]段

Flags

confirmoverwrite

在替换现有文件之前,始终要求用户确认。

createallsubdirs

默认情况下编译器在递归搜索 Source 文件名/通配符(例如 jre\*)时会跳过空目录。这个标志会在安装时创建这些目录,必须与recursesubdirs一起使用

deleteafterinstall

安装后删除,如果安装前文件存在,且未替换,则不删除,不能与isreadme, regserver, regtypelib, restartreplace, sharedfileuninsneveruninstall一起使用

dontverifychecksum

安装程序在提取后,不验证文件校验和。对已编译到安装程序中但希望修改的文件使用此标志。与nocompression一起使用

isreadme

文件是“ README”文件。安装中只有一个文件可以有这个标志。当一个文件有这个标志时,会出现一个选项,是否希望在安装完成后查看 README 文件。如果选择“是”,安装程序将打开该文件。对文件后缀有要求.txt, .wri, .doc

nocompression

不进行压缩

onlyifdoesntexist

只有当文件在用户系统上不存在时才安装该文件。

recursesubdirs

递归Source指定的目录

replacesameversion

用户的系统中已经存在该文件,并且版本号相同时,并且文件内容不同时,才替换该文件。PS:默认行为情况下,不替换具有相同版本号的现有文件。

uninsneveruninstall

不删除文件

文件替换规则

如果一个文件已经存在于用户的系统中,默认情况下将根据以下规则替换该文件:

  1. 如果现有文件的版本比正在安装的文件旧(由文件的版本信息决定) ,那么现有文件将被替换。
  2. 如果现有文件的版本与正在安装的文件相同,则不会替换现有文件,除非使用了replacesameversion并且两个文件的内容不同。
  3. 如果现有文件是比正在安装的文件更新的版本,或者如果现有文件具有版本信息,但正在安装的文件没有,则不会替换现有文件。
  4. 如果现有文件没有版本信息,它将被替换。

如果安装程序无法替换现有文件,因为另一个进程正在使用该文件,则安装程序将多达4次尝试替换该文件,每次尝试前延迟一秒钟。如果所有尝试都失败,将显示一条错误消息。

[Icons]

定义了安装程序在开始菜单和/或其他位置(如桌面)中创建快捷方式。

[Icons]
Name: "{autoprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; IconFilename: "E:\部署环境\dor\server\256.ico"

[INI]

定义希望安装程序在用户系统上设置的 .INI 文件条目。

[INI]
Filename: "SoundIDorServer.ini"; Section: "InstallSettings"; Key: "DateDir"; String:"{app}\data"
Filename: "SoundIDorServer.ini"; Section: "InstallSettings"; Key: "InstallPath"; String: "{app}"

[Languages]

定义了安装程序可用的语言。

[Languages]
Name: "zh"; MessagesFile: "compiler:Languages\Chinese.isl"

[Messages]

定义由安装程序和卸载程序显示的消息。

[CustomMessages]

定义自定义消息值

[CustomMessages]
autoBackupCases=安装前自动备份案件数据

[Tasks]
Name: "autoBackupCases"; Description: "{cm:autoBackupCases}"; GroupDescription: "案件数据:"; Components: tools\backups

[Registry]

定义您希望安装程序在用户系统上创建、修改或删除的任何注册表项/值

[Registry]
Root: HKA; Subkey: "Software\Classes\Applications\{#MyAppExeName}\dor"; ValueType: string; ValueName: "DataDir"; ValueData: "{code:SelectDataDir}"

Root

在这里插入图片描述

Root注册表Root key
HKCU(HKEY_CURRENT_USER)
HKLM(HKEY_LOCAL_MACHINE)
HKCR(HKEY_CLASSES_ROOT)
HKU(HKEY_USERS)
HKCC(HKEY_CURRENT_CONFIG)
HKA在管理员权限运行时为HKLM,否则为HKCU

ValueType

ValueType注册表
none创建键,但不创建值
stringREG_SZ
expandszREG_EXPAND_SZ
multiszREG_MULTI_SZ
dwordREG_DWORD
qwordREG_QWORD
binaryREG_BINARY

Flags

deletekey

安装程序将首先尝试删除存在的整个键,包括其中的所有值和子键。如果 ValueType 不是 none,那么它将创建一个新的键和值。

deletevalue

安装程序将首先尝试删除存在的值。如果 ValueType 不是 none,那么它将创建键(如果它不存在)和新值。

dontcreatekey

安装程序将不会尝试创建用户系统上尚不存在的键或任何值。如果键不存在,则不显示错误消息。

noerror

不显示错误消息

uninsclearvalue

卸载程序时,将值的数据设置为空字符串(类型为 REG _ SZ)。此标志不能与 uninsdeltekey 标志组合。

uninsdeletekeyifempty

卸载程序时,如果键中没有值或子键,则删除该键。此标志可以与 uninsdeletevalue 组合使用。

uninsdeletevalue

卸载程序时删除该值。此标志可以与 uninsdeletekeyifempty组合使用。

[Run]

安装过程中执行的操作,按照在脚本中出现的顺序执行。默认情况下,安装/卸载将等到程序终止后再继续下一个条目,

[Run]
Filename: "{app}\install.bat"; Description: "初始化系统环境"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden
Filename: "C:\Users\Public\asr\script\install.bat"; Description: "初始化ASR系统环境"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden
Filename: "{app}\switch.bat"; Description: "切换到标准版服务"; Flags: shellexec skipifsilent runascurrentuser waituntilterminated runhidden

Parameters

程序的可选命令行参数

Filename: "{app}\前端安装包.exe"; Parameters: "dataDir {app}\app"

StatusMsg

在执行程序时向导上显示的消息

Filename: "{app}\前端安装包.exe"; Parameters: "dataDir {app}\app";StatusMsg: "正在安装客户端程序,请稍等..." 

Flags

hidewizard

程序运行时将隐藏安装向导

nowait

不等待当前进程执行结束,直接执行下一个Run,不能与waituntilidlewaituntilterminated一起使用

postinstall

安装完成后,“安装完成”页面创建一个复选框,用户可以选择是否执行该Run。如果使用restartreplace或者 AlwaysRestart [Setup],安装完成后重启计算机,该选项将被忽略

unchecked

postinstall一起使用,不选中复选框

runascurrentuser

继承执行安装程序过程中的用户权限

runasoriginaluser

继承最初启动安装程序的用户权限

runhidden

隐藏窗口中执行

runmaximized

在最大化窗口中启动程序或文档

runminimized

在最小化窗口中启动程序或文档

shellexec

如果Filename不是可执行文件(.exe .com),使用该标志可以打开系统中的文件,等同于双击该文件。默认不等待该段执行完成,需要与waituntilterminated配合使用

waituntilterminated

等待进程终止,与shellexec配合使用

skipifnotsilent

安装程序非静默运行时跳过此项

skipifsilent

安装程序静默运行时跳过此项

[UninstallRun]

卸载时执行的程序,大部分参数与[Run]段相同

[Code]

编写Pascal 脚本实现功能,此处只在安装/卸载程序运作时生效

可以查阅该文档熟悉Pascal语法及特性

《Essential Pascal》

Install事件函数


InitializeSetup

function InitializeSetup(): Boolean;

在安装程序初始化期间调用。将 False 返回到中止安装程序,否则为 True。

示例代码

function InitializeSetup: Boolean;
var 
  ResultStr: String;
  ResultCode: Integer;
  regUnInstPath: String;
  hasUninstall:boolean;

begin
    if RegValueExists(HKLM64,regUnInstPath,'UninstallString') then
    begin
      case MsgBox('警告:【SoundIDorServer】应用程序正在运行。' #13#10 '请先卸载原有服务再进行安装,点击【是】则卸载原有服务,点击【否】则退出安装',mbInformation,MB_YESNO) of
        IDYES:
        begin       
			//xxxx
        end;
        IDNO:
        begin
          Result := false;
          exit;    
        end;
      end;
    end;
    result:=true;
end;

InitializeWizard

使用此事件函数可以在启动时对向导或向导页面进行更改

procedure InitializeWizard();

示例代码

procedure InitializeWizard;
var 
  RegDataDirPath ,DataDir :String;  
begin
    //创建一个选择数据存储目录的页面
    DataDirPage:=CreateInputDirPage(
      wpSelectDir,
      '数据存储目录',
      '任务数据会存储在选择的目录下, 请选择英文或数字路径!',
      '例如:您选择了E:\ , 则默认在E:\下创建文件夹dor, 数据最终会存储在E:\dor目录下',
      False,
      'dor'
    );
end;

DeinitializeSetup

在安装程序终止之前调用。即使用户在安装之前退出安装程序,也会调用此函数。

procedure DeinitializeSetup();

CurStepChanged

在安装前/安装后/安装完成是调用该函数

procedure CurStepChanged(CurStep: TSetupStep);

示例代码

procedure CurStepChanged(CurStep: TSetupStep);
var LogContext:string;
begin  
  case CurStep of
    ssInstall:
    begin
    //在实际安装开始之前调用
    end;
    ssPostInstall:
    begin
    //在实际安装完成之后调用
    end;
    ssDone:
    begin
    //在安装成功后关闭之前调用
    end;
  end;
end;

CurInstallProgressChanged

在安装程序提取文件、创建快捷方式、创建 INI 项和创建注册表项时,可以使用此事件函数监视进度。

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer);

NextButtonClick

当用户单击 Next 按钮时调用。如果返回 True,向导将移动到下一页; 如果返回 False,向导将保留在当前页(CurPageID)。

function NextButtonClick(CurPageID: Integer): Boolean;

CurPageID支持以下值

wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished

戳我查看CurPageID

BackButtonClick

当用户单击 Back 按钮时调用。如果返回 True,向导将移到上一页; 如果返回 False,向导将保留在当前页(CurPageID)。

function BackButtonClick(CurPageID: Integer): Boolean;

CancelButtonClick

当用户单击“取消”按钮或单击窗口的“关闭”按钮时调用。

//Cancel:指定是否应进行正常的取消处理,默认为true
//Confirm:指定是否弹出”是否确认退出“,默认为ture
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);

ShouldSkipPage

向导调用此事件函数来确定是否应显示当前页面(CurPageID),返回Ture跳过当前页面

function ShouldSkipPage(PageID: Integer): Boolean;

示例代码

procedure ShouldSkipPage(PageID: Integer);
var LogContext:string;
begin  
  if minimum(PageID) then
  begin
  	Result:=True;
  end;
  else
  begin
  	Result:=False;
  end;
end;

CurPageChanged

在显示当前页面( CurPageID )后调用。

procedure CurPageChanged(CurPageID: Integer);

CheckPassword

在输入密码后调用,返回False表示密码错误。PS:使用/PASSWORD参数进行安装时,该事件将在其他时间之前调用

function CheckPassword(Password: String): Boolean;

NeedRestart

返回 True 时,安装程序在成功安装结束时提示用户重新启动系统

function NeedRestart(): Boolean;

UpdateReadyMemo

TODO:

[与此页面有关](##Ready to Install),返回当前页面文本信息,

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;

Uninstall事件函数


InitializeUninstall

返回 False 终止卸载


function InitializeUninstall(): Boolean;

UninstallNeedRestart

返回 True 时, 卸载成功后提示用户重新启动系统,

function UninstallNeedRestart(): Boolean;

BeforeInstall and AfterInstall

  • 除了[ Language ]、[ Type ]、[ Component ]和[ Tasks ]之外,其他段都支持该函数

  • 定义的函数不能有返回值

  • 如果安装程序已经确定不应该处理条目,则不会调用 BeforeInstall 或 AfterInstall 函数

  • 使用通配符的项,每个文件都会调用一次该函数

    [Files]
    //会多次调用printFileName函数
    Source: "{#BasePath}\dor-server.jar"; DestDir: "{app}"; Flags: ignoreversion;AfterInstall:printFileName('{app}\bin\java.exe')
    
    [Code]
    procedure printFileName(FileName: String);
    begin
      if FileName <> CurrentFileName then
      begin
      	Log(FileName)
      end;
    end;
    

安装顺序

  1. [Dir]

  2. [Files]

  3. [Icons]

  4. [INI]

  5. [Registry]

  6. [Run](PS:对于使用Flags:postinstall的项需要特别注意)

向导页面

Welcome

欢迎页面,DisableWelcomePage=yes启用

在这里插入图片描述

License Agreement

用户协议页面,LicenseFile=license.txt启用

在这里插入图片描述

Password

输入密码的页面,Password=yes启用

在这里插入图片描述

Information**

自述文件页面,InfoBeforeFile=readme.txt启用

在这里插入图片描述

User Information

用户信息页面,UserInfoPage=yes启用

在这里插入图片描述

Select Destination Location

选择安装目录的页面,DisableDirPage=no禁用,auto时自动判断注册表内的值

在这里插入图片描述

Select Components

[Components]段定义的组件页面

在这里插入图片描述

Select Start Menu Folder

[Icon]段定义的快捷方式,此页面选择存放的目录

在这里插入图片描述

Select Tasks

[Tasks]段定义的任务项
在这里插入图片描述

Ready to Install

安装前的页面,DisableReadyPage=yes启用,

在这里插入图片描述

Preparing to Install

预安装页面

Installing

安装进度页面

Information

自述文件页面,安装完成后展示,InfoAfterFile=infoafter.txt启用

在这里插入图片描述

Setup Completed

安装完成页面

在这里插入图片描述

常量表

文件夹常量

常量名含义
{app}应用程序目录
{win}系统的 Windows 目录,C:\Windows
{sys}系统的 System32目录,C:\Windows\System
{sysnative}在64位 Windows 上,包含64位系统文件的目录。在32位 Windows 上,包含32位系统文件的目录。
{syswow64}C:\Windows\SysWOW64
{src}安装包所在的目录
{sd}系统盘目录,一般是C:
{commonpf}根据安装脚本的安装模式改变
{commonpf32}32位系统为C:\Program Files ,64位系统为 C:\Program Files (x86)
{commonpf64}C:\Program Files
{tmp}安装程序或卸载程序使用的临时目录,安装或卸载退出时,将删除此目录中的所有文件和子目录。在安装期间,这主要用于提取将在[ Run ]部分中执行但在安装后不需要的文件。

Auto Constants

常量名管理员权限安装非管理员权限安装
autoappdatacommonappdatauserappdata
autocfcommoncfusercf
autocf32commoncf32usercf
autocf64commoncf64usercf
autodesktopcommondesktopuserdesktop
autodocscommondocsuserdocs
autofontscommonfontsuserfonts
autopfcommonpfuserpf
autopf32commonpf32userpf
autopf64commonpf64userpf
autoprogramscommonprogramsuserprograms
autostartmenucommonstartmenuuserstartmenu
autostartupcommonstartupuserstartup
autotemplatescommontemplatesusertemplates

其他常量

常量名含义
{cmd}C:\Windows\System32\cmd.exe
{computername}计算机名称
{username}用户名

PS:我有空出一个专栏,讲解java应用打包成exe以及Inno setup打包java应用安装包
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!❤️❤️❤️

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以为您提供Inno Setup教程Inno Setup是一个用于创建Windows安装程序的免费工具。以下是一个简单的教程,帮助您入门: 步骤1:下载和安装Inno Setup 首先,您需要下载并安装Inno Setup。您可以在Inno Setup官方网站(https://jrsoftware.org/isinfo.php)上找到最新版本的下载链接。下载完成后,按照安装向导提示完成安装过程。 步骤2:创建一个新的安装脚本 打开Inno Setup并点击“File”菜单中的“New”选项,或者使用Ctrl + N快捷键来创建一个新的安装脚本。 步骤3:编辑安装脚本 在脚本编辑器中,您可以编写自定义的安装脚本。脚本是使用Pascal语言编写的,用于描述安装程序的行为和外观。您可以定义文件、文件夹、快捷方式、注册表项等等。以下是一个简单的例子: ```pascal [Setup] AppName=My Application AppVersion=1.0 DefaultDirName={pf}\My Application [Files] Source: "C:\MyFiles\*"; DestDir: "{app}"; Flags: recursesubdirs [Icons] Name: "{commondesktop}\My Application"; Filename: "{app}\MyApp.exe" ``` 在上面的例子中,我们定义了应用程序的名称、版本和默认安装目录。然后,我们将"C:\MyFiles\"目录下的所有文件和子文件夹复制到安装目录"{app}"中。最后,我们在桌面上创建了一个快捷方式。 步骤4:构建安装程序 完成脚本编写后,点击菜单栏中的“Compile”按钮或使用Ctrl + F9快捷键来编译安装脚本。编译成功后,您将获得一个可执行的安装程序。 步骤5:测试和发布 双击可执行安装程序进行测试。如果一切正常,您可以将生成的安装程序分发给其他用户。 这只是Inno Setup的基本使用教程,您还可以通过阅读官方文档和查找更多资源来深入了解和扩展您的安装脚本。希望这个简单的教程对您有帮助!如有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值