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 //软件卸载

 

posted @ 2017-03-15 17:15  DotNet码农  阅读(1732)  评论(0编辑  收藏  举报
/*粒子线条,鼠标移动会以鼠标为中心吸附的特效*/