了解一下C/S软件打包部署神器InnoSetup

系统 Windows
我们都知道做客户端软件,一般交付给客户的都是exe的安装包。那么我们平常开发完成之后,如何把程序进行打包呢。找了下发现Inno Setup是个不错的选择。

[[385773]]

本文转载自微信公众号「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 子目录中的一个脚本文件。(你也可以将这些示例脚本作为你自己编写脚本的模板。)

以下是我之前的项目的脚本

  1. ; Script generated by the Inno Setup Script Wizard. 
  2. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! 
  3.  
  4. #define MyAppName "主机助手" 
  5. #define MyAppVersion "1.1.1.7" 
  6. #define MyAppPublisher "点击网络, 技术部." 
  7. #define MyAppURL "http://yroot.bidns.net/" 
  8. #define MyAppExeName "主机助手.exe" 
  9.  
  10. [Setup] 
  11. ; NOTE: The value of AppId uniquely identifies this application. 
  12. ; Do not use the same AppId value in installers for other applications. 
  13. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) 
  14. AppId={{CD9818E0-FEE2-418E-9775-15F50AE2229E} 
  15. AppName={#MyAppName} 
  16. AppVersion={#MyAppVersion} 
  17. ;AppVerName={#MyAppName} {#MyAppVersion} 
  18. AppPublisher={#MyAppPublisher} 
  19. AppPublisherURL={#MyAppURL} 
  20. AppSupportURL={#MyAppURL} 
  21. AppUpdatesURL={#MyAppURL} 
  22. DefaultDirName={pf}\ZhugAssistant 
  23. DisableProgramGroupPage=yes 
  24. OutputDir=C:\Users\admin\Desktop 
  25. OutputBaseFilename=主机助手安装包 
  26. SetupIconFile=C:\Users\admin\Documents\Visual Studio 2010\Projects\yroot-10-24\yroot\bin\Debug\images\title.ico 
  27. Compression=lzma 
  28. SolidCompression=yes 
  29.  
  30. [Languages] 
  31. Name"english"; MessagesFile: "compiler:Default.isl" 
  32.  
  33. [Tasks] 
  34. Name"desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: exclusive 
  35. Name"quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked   
  36.  
  37. [Files] 
  38. Source: "D:\Debug\主机助手.exe"; DestDir: "{app}"; Flags: ignoreversion 
  39. Source: "D:\Debug\AccessSetup.exe"; DestDir: "{app}"; Flags: ignoreversion 
  40. Source: "D:\Debug\conf\*"; DestDir: "{app}\conf\"; Flags: ignoreversion recursesubdirs createallsubdirs 
  41. Source: "D:\Debug\data\*"; DestDir: "{app}\data\"; Flags: ignoreversion recursesubdirs createallsubdirs 
  42. Source: "D:\Debug\images\*"; DestDir: "{app}\images\"; Flags: ignoreversion recursesubdirs createallsubdirs 
  43. Source: "D:\Debug\tools\*"; DestDir: "{app}\tools\"; Flags: ignoreversion recursesubdirs createallsubdirs 
  44. Source: "D:\Debug\CSkin.dll"; DestDir: "{app}"; Flags: ignoreversion 
  45. Source: "D:\Debug\DiskQuotaTypeLibrary.dll"; DestDir: "{app}"; Flags: ignoreversion 
  46. Source: "D:\Debug\DMSkin.dll"; DestDir: "{app}"; Flags: ignoreversion 
  47. Source: "D:\Debug\form_data_path.txt"; DestDir: "{app}"; Flags: ignoreversion 
  48. Source: "D:\Debug\Interop.ADODB.dll"; DestDir: "{app}"; Flags: ignoreversion 
  49. Source: "D:\Debug\Interop.ADOX.dll"; DestDir: "{app}"; Flags: ignoreversion 
  50. Source: "D:\Debug\Interop.FsrmLib.dll"; DestDir: "{app}"; Flags: ignoreversion 
  51. Source: "D:\Debug\Interop.IISOle.dll"; DestDir: "{app}"; Flags: ignoreversion 
  52. Source: "D:\Debug\Interop.TaskScheduler.dll"; DestDir: "{app}"; Flags: ignoreversion 
  53. Source: "D:\Debug\MetroFramework.Design.dll"; DestDir: "{app}"; Flags: ignoreversion 
  54. Source: "D:\Debug\MetroFramework.dll"; DestDir: "{app}"; Flags: ignoreversion 
  55. Source: "D:\Debug\MetroFramework.Fonts.dll"; DestDir: "{app}"; Flags: ignoreversion 
  56. Source: "D:\Debug\Microsoft.Web.Administration.dll"; DestDir: "{app}"; Flags: ignoreversion 
  57. Source: "D:\Debug\Microsoft.Win32.TaskScheduler.dll"; DestDir: "{app}"; Flags: ignoreversion 
  58. Source: "D:\Debug\MySql.Data.dll"; DestDir: "{app}"; Flags: ignoreversion 
  59. Source: "D:\Debug\SimpleUpdater.dll"; DestDir: "{app}"; Flags: ignoreversion 
  60. Source: "D:\Debug\yroot.vshost.exe"; DestDir: "{app}"; Flags: ignoreversion 
  61. Source: "D:\Debug\yroot.vshost.exe.config"; DestDir: "{app}"; Flags: ignoreversion 
  62. Source: "D:\Debug\yroot.vshost.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion 
  63. Source: "D:\Debug\yroot_beta.vshost.exe"; DestDir: "{app}"; Flags: ignoreversion 
  64. Source: "D:\Debug\yroot_beta.vshost.exe.config"; DestDir: "{app}"; Flags: ignoreversion 
  65. Source: "D:\Debug\yroot_beta.vshost.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion 
  66. Source: "D:\Debug\主机助手.exe"; DestDir: "{app}"; Flags: ignoreversion 
  67. Source: "D:\Debug\主机助手.exe.config"; DestDir: "{app}"; Flags: ignoreversion 
  68. Source: "D:\Debug\主机助手.pdb"; DestDir: "{app}"; Flags: ignoreversion 
  69. ; NOTE: Don't use "Flags: ignoreversion" on any shared system files 
  70.  
  71. [Icons] 
  72. Name"{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 
  73. Name"{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 
  74. Name"{group}\{cm:UninstallProgram,主机助手}"; Filename: "{uninstallexe}"   
  75.  
  76. ;[Components]   
  77. ;Name: Access; Description: "Access支持" ; Types: Full   
  78.  
  79. [Messages]    
  80. ;卸载对话框说明   
  81. ConfirmUninstall=您真的想要从电脑中卸载主机助手吗?%n%n按 [是] 将会删除 %1 以及它的组件;%n按 [否] 则让软件继续留在您的电脑上.   
  82.  
  83. [Run] 
  84. Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 
  85.  
  86. [Registry]   
  87. Root: HKLM ;SubKey:"Software\ZhugAssistant";ValueType:dword;ValueName:config;ValueData:10 ;Flags: uninsdeletekey 
  88.  
  89. [code] 
  90. //init setup 
  91. function InitializeSetup(): boolean;   
  92. //var 
  93. var Istoken: boolean; //avoid setup again    
  94. begin        
  95. Istoken := true;         
  96. if RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\ZhugAssistant''config'then   
  97. begin   
  98.     MsgBox('程序已安装,请卸载后再尝试安装!',mbConfirmation, MB_OK);   
  99.     Istoken := false;   
  100. end else   
  101. begin   
  102.      Istoken := true;   
  103. end;   
  104. Result := Istoken;   
  105. end
  106.  
  107. //next button 
  108. function NextButtonClick(CurPageID: Integer): Boolean;   
  109. //var 
  110. var ResultCode: Integer;   
  111. var IsSetup : Boolean;   
  112. begin   
  113. IsSetup := true ;   
  114. case CurPageID of   
  115.     wpReady:   
  116.       begin   
  117.        if not RegValueExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Classes\CLSID\{6F3DD387-5AF2-492B-BDE2-30FF2F451241}\InprocServer32\12.0.0.0''RuntimeVersion'then   begin   
  118.           if MsgBox('程序执行需要Access数据库的支持,是否现在安装?', mbConfirmation, MB_YESNO) = idYes then begin   
  119.            ExtractTemporaryFile('AccessSetup.exe');    ExtractTemporaryFile('DMSkin.dll'); 
  120.             if not Exec(ExpandConstant('{tmp}\AccessSetup.exe'), '''', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode) then   
  121.               MsgBox('Access安装出错:' #13#13 ' ' + SysErrorMessage(ResultCode) + '.', mbError, MB_OK);   
  122.           end else begin   
  123.                 IsSetup := false ;   
  124.           end ;   
  125.           BringToFrontAndRestore();   
  126.         end;   
  127.       end;   
  128. end;   
  129. Result := IsSetup;   
  130. end
  131.    

 

责任编辑:武晓燕 来源: UP技术控
相关推荐

2022-03-10 07:39:33

.NET部署模式

2022-03-24 13:36:18

Java悲观锁乐观锁

2020-12-10 08:44:35

WebSocket轮询Comet

2024-04-11 12:19:01

Rust数据类型

2018-06-05 17:40:36

人工智能语音识别

2020-02-10 14:26:10

GitHub代码仓库

2019-02-20 14:16:43

2022-03-07 06:34:22

CQRS数据库数据模型

2018-07-17 14:42:50

2023-11-18 09:09:08

GNUBSD协议

2024-02-28 18:22:13

AI处理器

2023-02-08 09:02:05

VS Code摸鱼神器

2020-03-01 17:53:38

Excel大数据微软

2021-08-09 09:39:59

Docker部署镜像

2021-10-28 14:30:19

K8S Kubernetes数据持久化

2018-08-08 09:30:29

服务器知识Linux系统

2019-03-11 14:33:21

Redis内存模型数据库

2023-03-02 08:00:55

包管理工具pnpm 包

2020-12-21 05:56:54

Clipboard A复制图像开发技术

2023-05-09 08:25:26

Gaussdb数据库开源数据库
点赞
收藏

51CTO技术栈公众号