Inno Setup与NSIS有异曲同工之妙,且拥有更加简明的语法,其基于Delphi的扩展开发语法也更加友好。
花些时间简单了解一下,作为技术储备不深入研究,实际工作中主打NSIS。
实际案例:打包AutoCAD插件系统
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 ; 设置全局宏 #define MyAppName "XXX工具箱" #define MyAppVersion "1.0.0.1" #define MyAppPublisher "XXX公司" ; 设置注册表相关的全局宏 #define MAINDLL2021 "Toolkit_2021.dll" #define MAINDLL2022 "Toolkit_2022.dll" #define regACAD2021 "SOFTWARE\Autodesk\AutoCAD\R24.0\ACAD-4101:804" #define regACAD2022 "SOFTWARE\Autodesk\AutoCAD\R24.1\ACAD-5101:804" [Setup] ; 软件独一无二的ID AppId={{2ADB07D1-D7E2-42EC-92EE-A6868ED21060} ; 软件名称 AppName={#MyAppName} ; 软件版本 AppVersion={#MyAppVersion} ; 安装包名称(不包含后缀名) OutputBaseFilename={#MyAppName}{#MyAppVersion} ; 软件发布者 AppPublisher={#MyAppPublisher} ; 默认安装文件夹 DefaultDirName={autopf}\{#MyAppPublisher}\{#MyAppName} ; 启动菜单中所属文件夹 DefaultGroupName={#MyAppName} ; 设置是否允许用户不创建开始菜单 AllowNoIcons=no ; 设置压缩算法 Compression=lzma SolidCompression=yes ; 设置只能在64位操作系统上运行 ArchitecturesAllowed=x64 ; 设置安装路径在Program Files/ ArchitecturesInstallIn64BitMode=x64 ; 设置安装界面的样式 WizardStyle=modern ; 设置安装界面的尺寸是否可调整 WizardResizable=no ; 设置安装界面尺寸缩放 WizardSizePercent=100 ; 是否取消安装程序的欢迎界面 DisableWelcomePage=no ; 设置授权说明文件,注意该txt文件应该设置为Unicode BOM格式 LicenseFile=license.txt ; 防止通知打开多个安装进程 SetupMutex=SetupMutex{#SetupSetting("AppId")} [Messages] ; 同时打开多个安装进程时的提示 SetupAppRunningError=安装程序正在执行中,不能同时执行多个! ; 多语言设置,每一行代表可选的一种语言 [Languages] Name: "chinesesimplified"; MessagesFile: "compiler:Languages\ChineseSimplified.isl" ; Name: "en"; MessagesFile: "compiler:Default.isl" ; Name: "Japanese"; MessagesFile: "compiler:Languages\Japanese.isl" ; 安装文件到目标路径 [Files] ; 将Release下的所有文件和文件夹拷贝到安装路径,排除所有的pdb文件 Source: "D:\PROJECTS\安装包制作\Toolkit\Release\*"; Excludes: "*.pdb"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs ; 图标设置 [Icons] Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" ; 设置注册表 [Registry] Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: string; ValueName: "DESCRIPTION"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}')) Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: string; ValueName: "LOADER"; ValueData: "{app}\{#MAINDLL2021}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}')) Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "LOADCTRLS"; ValueData: 0x2; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}')) Root: HKCU; Subkey: "{#regACAD2021}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "MANAGED"; ValueData: 0x1; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2021}')) Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: string; ValueName: "DESCRIPTION"; ValueData: "{#MyAppName}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}')) Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: string; ValueName: "LOADER"; ValueData: "{app}\{#MAINDLL2022}"; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}')) Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "LOADCTRLS"; ValueData: 0x2; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}')) Root: HKCU; Subkey: "{#regACAD2022}\Applications\{#MyAppName}"; ValueType: dword; ValueName: "MANAGED"; ValueData: 0x1; Flags: uninsdeletekey; Check: ExistsAutoCAD(ExpandConstant('{#regACAD2022}')) [dirs] ; 设置文件夹权限为对所有用户完全开放权限 Name: "{app}"; Permissions: everyone-full ; 设置卸载时要删除的文件 [UninstallDelete] Type: filesandordirs; Name:"{app}" [Code] ; 检测是否存在某个版本的AutoCAD,借助注册表 function ExistsAutoCAD(const Name:string): Boolean; var Res: String; begin Result := RegQueryStringValue(HKEY_LOCAL_MACHINE, Name,'AcadLocation', Res) end;
关键点总结
压缩方式:和NSIS一样可以设置
注册表操作(读、写、删):读需要借助Delphi脚本实现,相比NSIS稍麻烦些
禁止启动多个安装进程:在这方面,Inno Setup有内置的控制参数,很方便
用户权限设置:在这方面,Inno Setup有内置的控制参数,很方便
读写xml文件:使用Delphi脚本实现,没有NSIS的插件方便