本文转载自微信公众号「UP技术控」,作者conan5566。转载本文请联系UP技术控公众号。
概述
我们都知道做客户端软件,一般交付给客户的都是exe的安装包。那么我们平常开发完成之后,如何把程序进行打包呢。找了下发现Inno Setup是个不错的选择。
InnoSetup 是一个免费的 Windows 安装程序制作软件。第一次发表是在 1997 年,Inno Setup 今天在功能设置和稳定性上的竞争力可能已经超过一些商业的安装程序制作软件。
能做什么
1.支持现在所有正在使用的 Windows 版本: 7, 2008 R2, Vista, XP, 2008,2003, 2000, Me, 98, 95, 和 NT 4.0 (不需要服务包)。
2.广泛支持在 64 位 的 Windows XP and Windows Server2003 版本的操作系统中的 64 位应用程序安装。支持 x64 和 Itanium 两个结构。(在 Itanium 结构中,必须在 64 位模式安装 Service Pack 1。)
3.支持创建单个EXE 格式的安装程序,使你的程序可以很方便地在网络上发表。同时也支持磁盘延伸。
4.标准的Windows 2000/XP 样式向导界面。
5.定制安装类型,例如:完整安装,最小安装,自定义安装。
6.完整的卸载功能。
7.文件安装:
包括完全的“压缩”支持,bzip2 和 7-Zip LZMA 文件压缩。安装程序可以比较文件版本信息,替换正在使用的文件,使用共享文件计数,注册DLL/OCX 和类型库,以及安装字体。
8.可以在任意地方创建快捷方式,包括开始菜单和桌面。
9.创建注册表 和.INI 条目。
10.在安装之前、之中或之后可运行其他程序。
11.支持多语言安装。
12.支持密码和加密安装。
13.支持数字签名 、安装和卸载。
14.后台安装和后台卸载。
15.Unicode安装。(Windows 2000/XP 或更高)
16.完整的Pascal 脚本 引擎选项于运行期高级自定义安装和卸载。
17.全部源代码公开(Borland Delphi 2.0-5.0 和 2009)。
创建安装程序的方式:脚本
安装程序用编译脚本的方式创建,脚本其实就是一个类似.INI 文件格式的 ASCII 码文本文件。(它不象你想象的那么复杂!)。Unicode Inno Setup支持 UTF-8 编码文本文件。
脚本用一个“.iss”(表示 Inno Setup Script脚本) 的扩展名。脚本控制着安装程序的所有方面。由它指定哪些文件将被安装到什么地方,在哪里创建快捷方式,且被命名为什么。
脚本文件一般可以用安装程序编译器程序内置的编辑器进行编辑。在你编写完脚本后,下一个最终步骤就是选择安装程序编译器中的“编译”。创建完成后,就可以运行根据你脚本编译的安装程序了。按默认,这个安装程序创建在包含脚本文件目录下的名为“输出”目录中。
如果你想看看它是怎样工作的,启动安装程序编译器,单击“文件 | 打开”,并选择位于 Inno Setup 安装目录下的Examples 子目录中的一个脚本文件。(你也可以将这些示例脚本作为你自己编写脚本的模板。)
以下是我之前的项目的脚本
- ; Script generated by the Inno Setup Script Wizard.
- ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
- #define MyAppName "主机助手"
- #define MyAppVersion "1.1.1.7"
- #define MyAppPublisher "点击网络, 技术部."
- #define MyAppURL "http://yroot.bidns.net/"
- #define MyAppExeName "主机助手.exe"
- [Setup]
- ; NOTE: The value of AppId uniquely identifies this application.
- ; Do not use the same AppId value in installers for other applications.
- ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
- AppId={{CD9818E0-FEE2-418E-9775-15F50AE2229E}
- AppName={#MyAppName}
- AppVersion={#MyAppVersion}
- ;AppVerName={#MyAppName} {#MyAppVersion}
- AppPublisher={#MyAppPublisher}
- AppPublisherURL={#MyAppURL}
- AppSupportURL={#MyAppURL}
- AppUpdatesURL={#MyAppURL}
- DefaultDirName={pf}\ZhugAssistant
- DisableProgramGroupPage=yes
- OutputDir=C:\Users\admin\Desktop
- OutputBaseFilename=主机助手安装包
- SetupIconFile=C:\Users\admin\Documents\Visual Studio 2010\Projects\yroot-10-24\yroot\bin\Debug\images\title.ico
- Compression=lzma
- SolidCompression=yes
- [Languages]
- Name: "english"; MessagesFile: "compiler:Default.isl"
- [Tasks]
- Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: exclusive
- Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
- [Files]
- Source: "D:\Debug\主机助手.exe"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\AccessSetup.exe"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\conf\*"; DestDir: "{app}\conf\"; Flags: ignoreversion recursesubdirs createallsubdirs
- Source: "D:\Debug\data\*"; DestDir: "{app}\data\"; Flags: ignoreversion recursesubdirs createallsubdirs
- Source: "D:\Debug\images\*"; DestDir: "{app}\images\"; Flags: ignoreversion recursesubdirs createallsubdirs
- Source: "D:\Debug\tools\*"; DestDir: "{app}\tools\"; Flags: ignoreversion recursesubdirs createallsubdirs
- Source: "D:\Debug\CSkin.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\DiskQuotaTypeLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\DMSkin.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\form_data_path.txt"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Interop.ADODB.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Interop.ADOX.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Interop.FsrmLib.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Interop.IISOle.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Interop.TaskScheduler.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\MetroFramework.Design.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\MetroFramework.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\MetroFramework.Fonts.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Microsoft.Web.Administration.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\Microsoft.Win32.TaskScheduler.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\MySql.Data.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\SimpleUpdater.dll"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot.vshost.exe"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot.vshost.exe.config"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot.vshost.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot_beta.vshost.exe"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot_beta.vshost.exe.config"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\yroot_beta.vshost.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\主机助手.exe"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\主机助手.exe.config"; DestDir: "{app}"; Flags: ignoreversion
- Source: "D:\Debug\主机助手.pdb"; DestDir: "{app}"; Flags: ignoreversion
- ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
- [Icons]
- Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
- Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
- Name: "{group}\{cm:UninstallProgram,主机助手}"; Filename: "{uninstallexe}"
- ;[Components]
- ;Name: Access; Description: "Access支持" ; Types: Full
- [Messages]
- ;卸载对话框说明
- ConfirmUninstall=您真的想要从电脑中卸载主机助手吗?%n%n按 [是] 将会删除 %1 以及它的组件;%n按 [否] 则让软件继续留在您的电脑上.
- [Run]
- Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
- [Registry]
- Root: HKLM ;SubKey:"Software\ZhugAssistant";ValueType:dword;ValueName:config;ValueData:10 ;Flags: uninsdeletekey
- [code]
- //init setup
- function InitializeSetup(): boolean;
- //var
- var Istoken: boolean; //avoid setup again
- begin
- Istoken := true;
- if RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\ZhugAssistant', 'config') then
- begin
- MsgBox('程序已安装,请卸载后再尝试安装!',mbConfirmation, MB_OK);
- Istoken := false;
- end else
- begin
- Istoken := true;
- end;
- Result := Istoken;
- end;
- //next button
- function NextButtonClick(CurPageID: Integer): Boolean;
- //var
- var ResultCode: Integer;
- var IsSetup : Boolean;
- begin
- IsSetup := true ;
- case CurPageID of
- wpReady:
- begin
- if not RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\CLSID\{6F3DD387-5AF2-492B-BDE2-30FF2F451241}\InprocServer32\12.0.0.0', 'RuntimeVersion') then begin
- if MsgBox('程序执行需要Access数据库的支持,是否现在安装?', mbConfirmation, MB_YESNO) = idYes then begin
- ExtractTemporaryFile('AccessSetup.exe'); ExtractTemporaryFile('DMSkin.dll');
- if not Exec(ExpandConstant('{tmp}\AccessSetup.exe'), '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then
- MsgBox('Access安装出错:' #13#13 ' ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);
- end else begin
- IsSetup := false ;
- end ;
- BringToFrontAndRestore();
- end;
- end;
- end;
- Result := IsSetup;
- end;