Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.
- 在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup ,
该工具是一个完全免费的Windows打包工具,涉及的功能比较全面,并且采用脚本式编辑,完美支持 Pascal 语言.本文简单描述一下如何自动下载安装 .net framework 框架 及更新卸图标的小技巧,当然本文部分内容借鉴了网上一部分的解决方案.在此整理一下已备忘同时分享给有类似需求的朋友.
- 替换卸载程序图标
该工具制作的安装包,默认生成的卸载程序使用的是和安装程序一样的图标,这样感觉不够直观,可通过 "UpdateIcon.dll" 插件完成. 如下脚本所示.[Files] Source: "UpdateIcon.dll"; Flags: dontcopy Source: "uninstall.ico"; Flags: dontcopy [Icons] Name: "{group}\卸载"; Filename: "{uninstallexe}"[Code] function UpdateIcon(const hWnd: Integer; const exeFileName, exeIcon, IcoFileName: String; wlangID: DWORD): Boolean; external 'UpdateIcon@files:UpdateIcon.dll stdcall';//替换卸载图标 function UpdateUninstIcon(const IcoFileName: String): Boolean; begin Result:= UpdateIcon(MainForm.Handle, '', '', IcoFileName, 0); end;//安装步骤进行开始替换卸载图标 procedure CurStepChanged(CurStep: TSetupStep); varsIcon: String; beginif CurStep=ssInstall thenbegin sIcon:= ExpandConstant('{tmp}\uninstall.ico'); //定义卸载图标 ExtractTemporaryFile(ExtractFileName(sIcon)); //释放卸载图标UpdateUninstIcon(sIcon);//替换卸载图标 end; end;
- 自动下载.net framework 组件并安装
可通过 “isxdl.dll” 扩展实现,动态从网络上添加一个待下载的文件,并在下载完之后自动运行.见如下示例. [Code] var dotNetDownloadNeeded: boolean;dotNetLocalPath:string;procedure isxdl_AddFile(URL, Filename: PAnsiChar); external 'isxdl_AddFile@files:isxdl.dll stdcall'; function isxdl_DownloadFiles(hWnd: Integer): Integer; external 'isxdl_DownloadFiles@files:isxdl.dll stdcall'; function isxdl_SetOption(Option, Value: PAnsiChar): Integer; external 'isxdl_SetOption@files:isxdl.dll stdcall';//检测是否存在特定版本的.net framework function IsDotNetDetected(version: string; service:cardinal): boolean; // Indicates whether the specified version and service pack of the .NET Framework is installed. // // version -- Specify one of these strings for the required .NET Framework version: // 'v1.1.4322' .NET Framework 1.1 // 'v2.0.50727' .NET Framework 2.0 // 'v3.0' .NET Framework 3.0 // 'v3.5' .NET Framework 3.5 // 'v4\Client' .NET Framework 4.0 Client Profile // 'v4\Full' .NET Framework 4.0 Full Installation // 'v4.5' .NET Framework 4.5 // // service -- Specify any non-negative integer for the required service pack level: // 0 No service packs required // 1, 2, etc. Service pack 1, 2, etc. required varkey: string;install, release, serviceCount: cardinal;check45, success: boolean; begin// .NET 4.5 installs as update to .NET 4.0 Fullif version = 'v4.5' then beginversion := 'v4\Full';check45 := true;end elsecheck45 := false;// installation key group for all .NET versionskey := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + version;// .NET 3.0 uses value InstallSuccess in subkey Setupif Pos('v3.0', version) = 1 then beginsuccess := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);end else beginsuccess := RegQueryDWordValue(HKLM, key, 'Install', install);end;// .NET 4.0/4.5 uses value Servicing instead of SPif Pos('v4', version) = 1 then beginsuccess := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);end else beginsuccess := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);end;// .NET 4.5 uses additional value Releaseif check45 then beginsuccess := success and RegQueryDWordValue(HKLM, key, 'Release', release);success := success and (release >= 378389);end;result := success and (install = 1) and (serviceCount >= service); end;//准备安装.net framework需要的条件(本地还是联网) function PreInstallDotNet(dotNetName:string;dotNetDownloadUrl:string):boolean; beginif (not IsAdminLoggedOn()) then beginMsgBox('您电脑安装 Microsoft .NET Framework 需要管理员权限', mbInformation, MB_OK);Result := false;end else begindotNetLocalPath := ExpandConstant('{src}') + '\'+dotNetName;if not FileExists(dotNetLocalPath) then begindotNetLocalPath := ExpandConstant('{tmp}') + '\'+dotNetName; if not FileExists(dotNetLocalPath) then beginisxdl_AddFile(dotNetDownloadUrl, dotNetLocalPath);dotNetDownloadNeeded := true;end;end;SetIniString('install', 'dotnetRedist', dotNetLocalPath, ExpandConstant('{tmp}\dep.ini'));end;end;//执行安装.net framework function DoInstallDotNet():boolean; varhWnd: Integer;ResultCode: Integer; beginresult := true;hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));// don’t try to init isxdl if it’s not needed because it will error on < ie 3if dotNetDownloadNeeded then beginisxdl_SetOption('label', '正在下载 Microsoft .NET Framework');isxdl_SetOption('des-c-r-i-p-tion', '您还未安装Microsoft .NET Framework. 请您耐心等待几分钟,下载完成后会安装到您的的计算机中。');if isxdl_DownloadFiles(hWnd) = 0 then result := false;end;if result = true then beginif Exec(ExpandConstant(dotNetLocalPath), '/qb', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then begin// handle success if necessary; ResultCode contains the exit codeif not (ResultCode = 0) then beginresult := false;end;end else begin// handle failure if necessary; ResultCode contains the error coderesult := false;end;end;end;//检测是否安装了等于大于指定版本的.net framework function IsIncludeFramework(version: string): boolean; varisInclued:boolean; begin //最高版本的if IsDotNetDetected('v4.5',0) then beginisInclued := true; end else if version = 'v4.5' then beginPreInstallDotNet('dotNetFx45_Full_setup.exe','http://download.microsoft.com/download/B/A/4/BA4A7E71-2906-4B2D-A0E1-80CF16844F5F/dotNetFx45_Full_setup.exe');end else if IsDotNetDetected('v4\Full',0) then beginisInclued := true;end else if version = 'v4\Full' then beginPreInstallDotNet('dotNetFx40_Full_x86_x64.exe','http://download.microsoft.com/download/9/5/A/95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE/dotNetFx40_Full_x86_x64.exe');end else if IsDotNetDetected('v4\Client',0) then beginisInclued := true; end else if version = 'v4\Client' then beginPreInstallDotNet('dotNetFx40_Client_x86_x64.exe','http://download.microsoft.com/download/5/6/2/562A10F9-C9F4-4313-A044-9C94E0A8FAC8/dotNetFx40_Client_x86_x64.exe');end else if IsDotNetDetected('v3.5',0) then beginisInclued := true; end else if Pos('v3.5',version) = 1 then beginPreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe');end else if IsDotNetDetected('v3.0',0) then beginisInclued := true; end else if Pos('v3.0',version) = 1 then beginPreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe');end else if IsDotNetDetected('v2.0.50727',0) then beginisInclued := true; end else if Pos('v2',version) = 1 then beginPreInstallDotNet('dotnetfx.exe','http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe');end else if IsDotNetDetected('v1.1.4322',0) then beginisInclued:= true;end else if Pos('v1',version)=1 then beginPreInstallDotNet('dotNetFx35setup.exe','http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe');end;result := isInclued; end;//点击下一步 function NextButtonClick(CurPage: Integer): Boolean; vardotNetVersion:String; beginResult := true;if (CurPage = wpReady) then begin dotNetVersion := 'v4\Full'; if not IsIncludeFramework(dotNetVersion) then beginif not DoInstallDotNet() then beginMsgBox('当前操作需要安装.NET Framework ' + dotNetVersion + '或以上版本。'#13#13'在尝试自动安装期间,似乎出现一些小问题(或用户取消了安装),'#13'请重试尝试安装。', mbInformation, MB_OK);result:= false;end;end;end; end;
关于通用
可以将以上两个小功能点分别保存为独立的innosetup 脚本文件(“.iss”),然后在主安装包脚本中引入这两个文件.如下所示.#include "dotnetSetup.iss" #include "updateuninstallIco.iss"
转载于:https://www.cnblogs.com/TBW-Superhero/p/6208286.html
Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.相关推荐
- ios .framework动态库重签名
真机上运行.framework时,如果报 dyld'dyld_fatal_error:dyld: Library not loaded: @rpath/XX.framework/XXReference ...
- InnoSetup打包自动签名
关于打包 我第一次接触打包,用的是inno Setup.软件自带文档,比较方便,而且我下载的是汉化版,更容易查询.刚开始用这个软件什么都不会,慢慢摸索,普通打包基本上没有问题了,后来因为打包的软件 ...
- 用swift+Metal shader文件编译framework动态库
若想用swift语言生成库则只能生成动态库,若是纯swift代码脚本,问题不大,按一般流程就行. 若是编译的库中有shader文件则需要先编译出Metal库.具体方法可采用如下的方式. 把shader ...
- python自动下载安装软件_30行Python代码从百度自动下载图片(内附源码和exe程序)...
只需要30行代码就可以从百度自动下载图片 大家好,我是行哥,一个专门教小学生撸Python的编程老师(小学生都能学会的编程) 这里行哥想问大家三个问题 : - 你还在为批量下载表情包发愁吗? - 你还 ...
- Framework 动态库加载 xib
Framework 无法直接使用 xib , 在项目中xib编译过后会产生一个nib的文件 所有需要把xib 转换为nib 使用命令把 xib 转行为nib ibtool --errors --war ...
- 将动态库添加到VC程序中
应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.ex ...
- VC#打包部署全攻略之(一、添加卸载程序)
一.在系统文件的system32文件夹下找到msiexec.exe.(c:\windows\system32\msiexec.exe)在打包项目中应用程序文件夹中添加文件msiexec.exe. 二. ...
- 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )
文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...
- iOS 热更新,实时代码更新,动态更新,动态库framework
允许转载! demo 下载 只要审核通过后,无须再次审核,就可以动态更新,iOS有三种处理方案: 一.开源框架 reactive native,但是编程语言是js 二.lua 脚本 三.使用oc语言的 ...
- Ios热更新,实时代码更新,动态更新,动态库framework
动态更新,iOS有三种处理方案 1,开源框架reactive native,但是编程语言是js iOS app可以在运行时从服务器拉去最新的js文件到本读,然后执行,因为js是一门动态的脚本语言 所以 ...
最新文章
- java ee 修改_java ee 在数据库中执行增删改查
- [ python ] 类的组合
- POJ2406简单KMP
- 向页面中添加音乐或flash
- 用GrabCut进行前景检测(对书中代码进行改进)Python
- oracle 12c 自动任务,Oracle job自动任务实用指南
- 【学习笔记】第一章——操作系统的系统调用(陷入指令、库函数、作用流程)
- SAP License:金融工具创新与会计创新
- Power Query获取整理多来源数据
- 2014年03月 面试总结
- python 类内置方法
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 我的2017OKR - 年中回顾
- w ndows7手机桌面,Windows 7中有哪些常用的桌面小工具
- Scratch编程入门
- docker编配和服务发现
- iOS10 更新后问题,获取相册,录音时候闪退问题
- html5 logo背景透明度,使用纯洁的CSS实现HTML5的新logo
- WLC license管理
- android 锁屏的生命周期_Activity的生命周期的七个场景
热门文章
- Linux调试分析诊断利器——strace
- Security log is full,only administrator can log on to fix the problem(安全日志满了)
- java面向对象(封装-继承-多态)
- 从几何解释SVD分解
- px2rem 第三方库实践
- 电商项目面试题 及mysql面试题 太难没啥用
- Chromium引擎控件DotNetBrowser V1.14发布 | 附下载
- java前后端分离是否会成为趋势
- SecureCRT在linux与windows本地互传文件之SFTP
- java设计模式案例详解:观察者模式