Inno打包时添加运行环境,安装时检测是否有运行环境

在使用Inno打包软件时,有可能软件运行的环境目标电脑没有,这时就需要我们预先将环境安装包一起打包。测试打包的环境是.net framework 4.7.2。

1、先使用Inno脚本创建向导,未出现的图片均可以“下一步”,也可以按照实际需求进行更改;

2、如上图片所示,在添加文件中,添加目标需要的环境包;

3、在生成的代码里面会有下图,就是刚才添加的包:

4、如果需要在安装过程中提示“是否创建桌面快捷方式”,可按照下面更改:

5、接下来在代码的最后添加[Code]代码,检测目标电脑是否有环境

[Code]
function IsDotNetDetected(version: string; service: cardinal): boolean;
var
    key, versionKey: string;
    install, release, serviceCount, versionRelease: cardinal;
    success: boolean;
begin
    versionKey := version;
    versionRelease := 0;
    // .NET 1.1 and 2.0 embed release number in version key
    if version = 'v1.1' then begin
        versionKey := 'v1.1.4322';
    end else if version = 'v2.0' then begin
        versionKey := 'v2.0.50727';
    end

    // .NET 4.5 and newer install as update to .NET 4.0 Full
    else if Pos('v4.', version) = 1 then begin
        versionKey := 'v4\Full';
        case version of
          'v4.5':   versionRelease := 378389;
          'v4.5.1': versionRelease := 378675; // 378758 on Windows 8 and older
          'v4.5.2': versionRelease := 379893;
          'v4.6':   versionRelease := 393295; // 393297 on Windows 8.1 and older
          'v4.6.1': versionRelease := 394254; // 394271 on Windows 8.1 and older
          'v4.6.2': versionRelease := 394802; // 394806 on Windows 8.1 and older
          'v4.7':   versionRelease := 460798;
          'v4.7.1': versionRelease := 461308;
          'v4.7.2': versionRelease := 461814;
          'v4.8':   versionRelease := 528040;
        end;
    end;

    // installation key group for all .NET versions
    key := 'SOFTWARE\Microsoft\NET Framework Setup\NDP\' + versionKey;
    // .NET 3.0 uses value InstallSuccess in subkey Setup
    if Pos('v3.0', version) = 1 then begin
        success := RegQueryDWordValue(HKLM, key + '\Setup', 'InstallSuccess', install);
    end else begin
        success := RegQueryDWordValue(HKLM, key, 'Install', install);
    end;

    // .NET 4.0 and newer use value Servicing instead of SP
    if Pos('v4', version) = 1 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Servicing', serviceCount);
    end else begin
        success := success and RegQueryDWordValue(HKLM, key, 'SP', serviceCount);
    end;

    // .NET 4.5 and newer use additional value Release
    if versionRelease > 0 then begin
        success := success and RegQueryDWordValue(HKLM, key, 'Release', release);
        success := success and (release >= versionRelease);
    end;

    result := success and (install = 1) and (serviceCount >= service);
end;

[Code]
function InitializeSetup(): Boolean;
var ResultCode:Integer;
Path,tmppath:string ;
dotNetV2PackFile:string;
begin
    dotNetV2PackFile:='{src}\NDP472-KB4054530-x86-x64-AllOS-ENU - netframework472.exe';
    if not IsDotNetDetected('v4.7.2', 0) then begin
      if msgbox('系统检测到您缺少.Net Framework4.7.2环境,是否立即安装?', mbConfirmation, MB_YESNO)=idYes then begin
        Path := ExpandConstant(dotNetV2PackFile);
        tmppath :=  ExpandConstant('{tmp}\NDP472-KB4054530-x86-x64-AllOS-ENU - netframework472.exe');
        ExtractTemporaryFile('NDP472-KB4054530-x86-x64-AllOS-ENU - netframework472.exe');
        //msgbox('系统检测到您缺少.Net Framework4.7.2环境,是否立即安装?', mbConfirmation, MB_YESNO);
        Exec(tmppath, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
      end;
      //经测试.NET 4.7.2安装成功Exec仍返回false,改用IsDotNetDetected再检测一次
      if not IsDotNetDetected('v4.7.2', 0) then begin
        MsgBox('.Net Framework4.7.2组件安装失败,无法运行程序,安装程序即将退出!',mbInformation,MB_OK);
        result := false;
      end else begin
        result := true;
      end
    end else begin
      result := true;
    end
end;

6、以上即可。

总结:由于我也是才学习这个打包工具进行检测,所以在InitializeSetup检测中应该有部分代码是冗余的,我没有过多的去关注,查资料的时候发现[Code]里面的编写还是很好玩的,后面有时间可以多学习下。

参考连接:

https://www.cnblogs.com/lovelp/p/4437839.html

https://www.cnblogs.com/xiaogangqq123/archive/2012/03/19/2405730.html

https://blog.csdn.net/tjjingpan/article/details/104657360

https://blog.csdn.net/WPwalter/article/details/103268614

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值