在使用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