1. 在使用了一段时间微软自带的安装包打包工具后,总感觉不太顺利,于是便想着找一种更简单稳定的打包工具,这类工具其实还不少,最终经过各种考量,我们选择了 InnoSetup ,

    该工具是一个完全免费的Windows打包工具,涉及的功能比较全面,并且采用脚本式编辑,完美支持 Pascal 语言.本文简单描述一下如何自动下载安装 .net framework 框架 及更新卸图标的小技巧,当然本文部分内容借鉴了网上一部分的解决方案.在此整理一下已备忘同时分享给有类似需求的朋友.

  2. 替换卸载程序图标
                 该工具制作的安装包,默认生成的卸载程序使用的是和安装程序一样的图标,这样感觉不够直观,可通过 "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;

  3. 自动下载.net framework 组件并安装 
           可通过 “isxdl.dll” 扩展实现,动态从网络上添加一个待下载的文件,并在下载完之后自动运行.见如下示例.
  4. [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”),然后在主安装包脚本中引入这两个文件.如下所示.

  5. #include "dotnetSetup.iss"
    #include "updateuninstallIco.iss"

转载于:https://www.cnblogs.com/TBW-Superhero/p/6208286.html

Innosetup打包自动下载.net framework 动态库及替换卸载程序图标.相关推荐

  1. ios .framework动态库重签名

    真机上运行.framework时,如果报 dyld'dyld_fatal_error:dyld: Library not loaded: @rpath/XX.framework/XXReference ...

  2. InnoSetup打包自动签名

    关于打包 ​ 我第一次接触打包,用的是inno Setup.软件自带文档,比较方便,而且我下载的是汉化版,更容易查询.刚开始用这个软件什么都不会,慢慢摸索,普通打包基本上没有问题了,后来因为打包的软件 ...

  3. 用swift+Metal shader文件编译framework动态库

    若想用swift语言生成库则只能生成动态库,若是纯swift代码脚本,问题不大,按一般流程就行. 若是编译的库中有shader文件则需要先编译出Metal库.具体方法可采用如下的方式. 把shader ...

  4. python自动下载安装软件_30行Python代码从百度自动下载图片(内附源码和exe程序)...

    只需要30行代码就可以从百度自动下载图片 大家好,我是行哥,一个专门教小学生撸Python的编程老师(小学生都能学会的编程) 这里行哥想问大家三个问题 : - 你还在为批量下载表情包发愁吗? - 你还 ...

  5. Framework 动态库加载 xib

    Framework 无法直接使用 xib , 在项目中xib编译过后会产生一个nib的文件 所有需要把xib 转换为nib 使用命令把 xib 转行为nib ibtool --errors --war ...

  6. 将动态库添加到VC程序中

    应用程序使用DLL可以采用两种方式:一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息.Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.ex ...

  7. VC#打包部署全攻略之(一、添加卸载程序)

    一.在系统文件的system32文件夹下找到msiexec.exe.(c:\windows\system32\msiexec.exe)在打包项目中应用程序文件夹中添加文件msiexec.exe. 二. ...

  8. 【Android NDK 开发】Android.mk 配置静态库 ( Android Studio 配置静态库 | 配置动态库与静态库区别 | 动态库与静态库打包对比 )

    文章目录 I . Android Studio 中使用 Android.mk 配置静态库 总结 II . 第三方动态库来源 III . 配置 Android.mk 构建脚本路径 IV . 预编译 第三 ...

  9. iOS 热更新,实时代码更新,动态更新,动态库framework

    允许转载! demo 下载 只要审核通过后,无须再次审核,就可以动态更新,iOS有三种处理方案: 一.开源框架 reactive native,但是编程语言是js 二.lua 脚本 三.使用oc语言的 ...

  10. Ios热更新,实时代码更新,动态更新,动态库framework

    动态更新,iOS有三种处理方案 1,开源框架reactive native,但是编程语言是js iOS app可以在运行时从服务器拉去最新的js文件到本读,然后执行,因为js是一门动态的脚本语言 所以 ...

最新文章

  1. java ee 修改_java ee 在数据库中执行增删改查
  2. [ python ] 类的组合
  3. POJ2406简单KMP
  4. 向页面中添加音乐或flash
  5. 用GrabCut进行前景检测(对书中代码进行改进)Python
  6. oracle 12c 自动任务,Oracle job自动任务实用指南
  7. 【学习笔记】第一章——操作系统的系统调用(陷入指令、库函数、作用流程)
  8. SAP License:金融工具创新与会计创新
  9. Power Query获取整理多来源数据
  10. 2014年03月 面试总结
  11. python 类内置方法
  12. 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
  13. 我的2017OKR - 年中回顾
  14. w ndows7手机桌面,Windows 7中有哪些常用的桌面小工具
  15. Scratch编程入门
  16. docker编配和服务发现
  17. iOS10 更新后问题,获取相册,录音时候闪退问题
  18. html5 logo背景透明度,使用纯洁的CSS实现HTML5的新logo
  19. WLC license管理
  20. android 锁屏的生命周期_Activity的生命周期的七个场景

热门文章

  1. Linux调试分析诊断利器——strace
  2. Security log is full,only administrator can log on to fix the problem(安全日志满了)
  3. java面向对象(封装-继承-多态)
  4. 从几何解释SVD分解
  5. px2rem 第三方库实践
  6. 电商项目面试题 及mysql面试题 太难没啥用
  7. Chromium引擎控件DotNetBrowser V1.14发布 | 附下载
  8. java前后端分离是否会成为趋势
  9. SecureCRT在linux与windows本地互传文件之SFTP
  10. java设计模式案例详解:观察者模式