Inno Setup 软件封装
例子:
1 ; 脚本用 Inno Setup 脚本向导 生成。 2 ; 查阅文档获取创建 INNO SETUP 脚本文件的详细资料! 3 4 #define MyAppName "隧道照明系统客户端程序" 5 #define MyAppVersion "1.5" 6 #define MyAppPublisher "深圳市泰达鑫信息科技有限公司" 7 #define MyAppURL "http://www.tdx-it.com/" 8 #define MyAppExeName "TunnelLighting.exe" 9 10 [Setup] 11 ; 注意: AppId 的值是唯一识别这个程序的标志。 12 ; 不要在其他程序中使用相同的 AppId 值。 13 ; (在编译器中点击菜单“工具 -> 产生 GUID”可以产生一个新的 GUID) 14 AppId={{71C8E092-1FB6-43ED-B5A4-CDD9281CC72D} 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}\{#MyAppName} 23 DisableDirPage=yes 24 DefaultGroupName={#MyAppName} 25 LicenseFile=D:\InstallPackage\Client\License.txt 26 InfoAfterFile=D:\InstallPackage\Client\UpdateLog.txt.txt 27 OutputDir=D:\InstallPackage 28 OutputBaseFilename=TunnelLight 29 SetupIconFile=D:\InstallPackage\Server\InstallIcon.ico 30 Compression=lzma 31 SolidCompression=yes 32 33 [Languages] 34 Name: "default"; MessagesFile: "compiler:Default.isl" 35 Name: "chinesesimp"; MessagesFile: "compiler:Languages\ChineseSimp.isl" 36 Name: "english"; MessagesFile: "compiler:Languages\English.isl" 37 38 [Messages] 39 BeveledLabel={#MyAppPublisher} 40 ConfirmUninstall=您真的想要从电脑中卸载ISsample吗?%n%n按 [是] 则完全删除 %1 以及它的所有组件;%n按 [否]则让软件继续留在您的电脑上. 41 42 [Tasks] 43 Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags:checkablealone 44 ;unchecked 45 46 [Files] 47 Source: "D:\Program Files\Inno Setup 5\Plugins\ISXDL.dll"; Flags: dontcopy 48 Source: "D:\InstallPackage\Client\TunnelLighting.exe"; DestDir: "{app}"; Flags: ignoreversion 49 Source: "D:\InstallPackage\Client\Aga.Controls.dll"; DestDir: "{app}"; Flags: ignoreversion 50 Source: "D:\InstallPackage\Client\Base.Common.dll"; DestDir: "{app}"; Flags: ignoreversion 51 Source: "D:\InstallPackage\Client\Base.Common.pdb"; DestDir: "{app}"; Flags: ignoreversion 52 Source: "D:\InstallPackage\Client\Base.Controller.dll"; DestDir: "{app}"; Flags: ignoreversion 53 Source: "D:\InstallPackage\Client\Base.Controller.pdb"; DestDir: "{app}"; Flags: ignoreversion 54 Source: "D:\InstallPackage\Client\Base.Dal.dll"; DestDir: "{app}"; Flags: ignoreversion 55 Source: "D:\InstallPackage\Client\Base.Dal.pdb"; DestDir: "{app}"; Flags: ignoreversion 56 Source: "D:\InstallPackage\Client\Base.Model.dll"; DestDir: "{app}"; Flags: ignoreversion 57 Source: "D:\InstallPackage\Client\Base.Model.pdb"; DestDir: "{app}"; Flags: ignoreversion 58 Source: "D:\InstallPackage\Client\License.txt"; DestDir: "{app}"; Flags: ignoreversion 59 Source: "D:\InstallPackage\Client\TunnelLighting.exe"; DestDir: "{app}"; Flags: ignoreversion 60 Source: "D:\InstallPackage\Client\TunnelLighting.exe.config"; DestDir: "{app}"; Flags: ignoreversion 61 Source: "D:\InstallPackage\Client\TunnelLighting.pdb"; DestDir: "{app}"; Flags: ignoreversion 62 Source: "D:\InstallPackage\Client\TunnelLighting.vshost.exe"; DestDir: "{app}"; Flags: ignoreversion 63 Source: "D:\InstallPackage\Client\TunnelLighting.vshost.exe.config"; DestDir: "{app}"; Flags: ignoreversion 64 Source: "D:\InstallPackage\Client\TunnelLighting.vshost.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion 65 Source: "D:\InstallPackage\Client\UpdateLog.txt.txt"; DestDir: "{app}"; Flags: ignoreversion 66 Source: "D:\InstallPackage\Client\websocket-sharp.dll"; DestDir: "{app}"; Flags: ignoreversion 67 Source: "D:\InstallPackage\Client\holePic\*"; DestDir: "{app}\holePic"; Flags: ignoreversion recursesubdirs createallsubdirs 68 ; 注意: 不要在任何共享的系统文件使用 "Flags: ignoreversion" 69 70 [Icons] 71 Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" 72 Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" 73 Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon 74 75 [Run] 76 Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent 77 78 [Code] 79 80 var 81 dotNetDownloadNeeded: boolean; 82 dotNetLocalPath:string; 83 84 procedure isxdl_AddFile(URL, Filename: PAnsiChar); 85 external 'isxdl_AddFile@files:isxdl.dll stdcall'; 86 function isxdl_DownloadFiles(hWnd: Integer): Integer; 87 external 'isxdl_DownloadFiles@files:isxdl.dll stdcall'; 88 function isxdl_SetOption(Option, Value: PAnsiChar): Integer; 89 external 'isxdl_SetOption@files:isxdl.dll stdcall'; 90 91 92 93 94 function DoInstallDotNet():boolean; 95 var 96 hWnd: Integer; 97 ResultCode: Integer; 98 begin 99 result := true; 100 hWnd := StrToInt(ExpandConstant('{wizardhwnd}')); 101 102 // don’t try to init isxdl if it’s not needed because it will error on < ie 3 103 if dotNetDownloadNeeded then begin 104 isxdl_SetOption('label', '正在下载 Microsoft .NET Framework'); 105 isxdl_SetOption('des-c-r-i-p-tion', '您还未安装Microsoft .NET Framework. 请您耐心等待几分钟,下载完成后会安装到您的的计算机中。'); 106 if isxdl_DownloadFiles(hWnd) = 0 then result := false; 107 end; 108 109 if result = true then begin 110 if Exec(ExpandConstant(dotNetLocalPath), '/qb', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin 111 // handle success if necessary; ResultCode contains the exit code 112 if not (ResultCode = 0) then begin 113 result := false; 114 end; 115 end else begin 116 // handle failure if necessary; ResultCode contains the error code 117 result := false; 118 end; 119 end; 120 121 end; 122 123 //执行安装.net framework 124 125 function PreInstallDotNet(dotNetName:string;dotNetDownloadUrl:string):boolean; 126 begin 127 if (not IsAdminLoggedOn()) then begin 128 MsgBox('您电脑安装 Microsoft .NET Framework 需要管理员权限', mbInformation, MB_OK); 129 Result := false; 130 end else begin 131 dotNetLocalPath := ExpandConstant('{src}') + '\'+dotNetName; 132 if not FileExists(dotNetLocalPath) then begin 133 dotNetLocalPath := ExpandConstant('{tmp}') + '\'+dotNetName; 134 if not FileExists(dotNetLocalPath) then begin 135 isxdl_AddFile(dotNetDownloadUrl, dotNetLocalPath); 136 dotNetDownloadNeeded := true; 137 end; 138 end; 139 140 SetIniString('install', 'dotnetRedist', dotNetLocalPath, ExpandConstant('{tmp}\dep.ini')); 141 end; 142 143 end; 144 //准备安装.net framework需要的条件(本地还是联网) 145 146 function IsDotNetDetected(version: string; service:cardinal): boolean; 147 // Indicates whether the specified version and service pack of the .NET Framework is installed. 148 // 149 // version -- Specify one of these strings for the required .NET Framework version: 150 // 'v1.1.4322' .NET Framework 1.1 151 // 'v2.0.50727' .NET Framework 2.0 152 // 'v3.0' .NET Framework 3.0 153 // 'v3.5' .NET Framework 3.5 154 // 'v4\Client' .NET Framework 4.0 Client Profile 155 // 'v4\Full' .NET Framework 4.0 Full Installation 156 // 'v4.5' .NET Framework 4.5 157 // 158 // service -- Specify any non-negative integer for the required service pack level: 159 // 0 No service packs required 160 // 1, 2, etc. Service pack 1, 2, etc. required 161 var 162 key: string; 163 install, release, serviceCount: cardinal; 164 check45, success: boolean; 165 begin 166 // .NET 4.5 installs as update to .NET 4.0 Full 167 if version = 'v4.5' then begin 168 version := 'v4\Full'; 169 check45 := true; 170 end else 171 check45 := false; 172 173 // installation key group for all .NET versions 174 key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version; 175 176 // .NET 3.0 uses value InstallSuccess in subkey Setup 177 if Pos('v3.0', version) = 1 then begin 178 success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install); 179 end else begin 180 success := RegQueryDWordValue(HKLM, key, 'Install', install); 181 end; 182 183 // .NET 4.0/4.5 uses value Servicing instead of SP 184 if Pos('v4', version) = 1 then begin 185 success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount); 186 end else begin 187 success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount); 188 end; 189 190 // .NET 4.5 uses additional value Release 191 if check45 then begin 192 success := success and RegQueryDWordValue(HKLM, key, 'Release', release); 193 success := success and (release >= 378389); 194 end; 195 196 result := success and (install = 1) and (serviceCount >= service); 197 end; 198 //检测是否存在(已安装)特定版本的.net framework 199 200 201 //----------------------------------- 202 203 //取得自定义的配置 204 // Setup.ini 205 // [Custom] 206 // dotNetVersion = v4.5 207 function GetCustomConfig(key:string):string; 208 var 209 myValue:string; 210 begin 211 myValue:=ExpandConstant('{ini:{src}\Setup.ini,Custom,'+key+'}') 212 result := myValue; 213 end; 214 215 function InitializeSetup(): Boolean; 216 begin 217 //do something 218 219 result:= true; 220 end; 221 //初始化安装 222 223 function IsIncludeFramework(version: string): boolean; 224 var 225 isInclued:boolean; 226 begin 227 228 //最高版本的 229 if IsDotNetDetected('v4.5',0) then begin 230 isInclued := true; 231 end else if version = 'v4.5' then begin 232 PreInstallDotNet('dotNetFx45_Full_setup.exe','http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe'); 233 end else if IsDotNetDetected('v4\Full',0) then begin 234 isInclued := true; 235 end else if version = 'v4\Full' then begin 236 PreInstallDotNet('dotNetFx40_Full_x86_x64.exe','http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe'); 237 end else if IsDotNetDetected('v4\Client',0) then begin 238 isInclued := true; 239 end else if version = 'v4\Client' then begin 240 PreInstallDotNet('dotNetFx40_Client_x86_x64.exe','http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe'); 241 end else if IsDotNetDetected('v3.5',0) then begin 242 isInclued := true; 243 end else if Pos('v3.5',version) = 1 then begin 244 PreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe'); 245 end else if IsDotNetDetected('v3.0',0) then begin 246 isInclued := true; 247 end else if Pos('v3.0',version) = 1 then begin 248 PreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe'); 249 end else if IsDotNetDetected('v2.0.50727',0) then begin 250 isInclued := true; 251 end else if Pos('v2',version) = 1 then begin 252 PreInstallDotNet('dotnetfx.exe','http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe'); 253 end else if IsDotNetDetected('v1.1.4322',0) then begin 254 isInclued:= true; 255 end else if Pos('v1',version)=1 then begin 256 PreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe'); 257 end; 258 259 result := isInclued; 260 end; 261 262 263 264 //检测是否安装了等于大于指定版本的.net framework 265 function NextButtonClick(CurPage: Integer): Boolean; 266 var 267 dotNetVersion:string; 268 begin 269 Result := true; 270 271 if (CurPage = wpReady) then begin 272 273 dotNetVersion := GetCustomConfig('dotNetVersion'); 274 if Length(dotNetVersion) = 0 then begin 275 dotNetVersion := 'v4.0'; 276 end else if not (Pos('v',dotNetVersion) = 1) then begin 277 dotNetVersion := 'v'+dotNetVersion; 278 end; 279 280 if not IsIncludeFramework(dotNetVersion) then begin 281 if not DoInstallDotNet() then begin 282 MsgBox('当前操作需要安装.NET Framework ' + dotNetVersion + '或以上版本。'#13#13 283 '在尝试自动安装期间,似乎出现一些小问题(或用户取消了安装),'#13 284 '请重试尝试安装。', mbInformation, MB_OK); 285 result:= false; 286 end; 287 end; 288 289 end; 290 291 end; 292 //安装出错或取消时 293 294 procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); 295 var 296 ErrorCode: Integer; 297 begin 298 case CurUninstallStep of 299 usUninstall: 300 begin 301 // 正在卸载 302 end; 303 usPostUninstall: 304 begin 305 //卸载完成 306 ShellExec('open', 'http://www.tdx-it.com', '', '', SW_SHOW, ewNoWait, ErrorCode) 307 308 end; 309 end; 310 end; 311 312 //软件卸载
作者:DotNet码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.