Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: Inno setup 脚本判断 Microsoft Visual C++ Redistributable 不同版本区别

有个需要是需要在安装包安装初始化时安装 Microsoft Visual c++ 2013 Redistributable

也就是判断软件安装前需不需要运行 vcredist_x64.exeVC_redist.x64.exe 这两个程序

第一反应就是可以通过注册表判断是否已经安装过环境

但测试发现需求的两个版本不同,注册表位置竟然也不一样

问 chatgpt 答案不对,bing 搜索半天也没找到答案,stackoverflow 也有很多类的答案测试后很多都无法成功,最后结合多个结果终于折腾成功

记录如下:

判断 Microsoft Visual c++ 2013 Redistributable(x64) - 12.0.30501 是否已经安装

注册表位置 'SOFTWARE\WOW6432Node\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum'

官方下载的安装包名为 vcredist_x64.exe

function IsVCRedistInstalled2013: Boolean;
var
  ResultCode: Cardinal;
begin
  Result := RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Microsoft\DevDiv\vc\Servicing\12.0\RuntimeMinimum', 'Install', ResultCode);
  if Result and (ResultCode = 1) then
  begin
    Log('vcredist_x64 2013 visual c++ redistrbutable has already been installed.');
  end
  else
  begin
    Log('vcredist_x64 2013 never installed. installing...');
  end;
end;

判断 Microsoft Visual C++ 2015-2022 Redistributable(x64) - 14.31.31103 是否已经安装

注册表位置 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64

官方下载的安装包名为 VC_redist.x64.exe

function IsVCRedistInstalled2015_2022: Boolean;
var
  ResultCode: Cardinal;
begin
  Result := RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Installed', ResultCode);
  if Result and (ResultCode = 1) then
  begin
    Log('VC_redist.x64 2015+  visual c++ redistrbutable has already been installed.');
  end
  else
  begin
    Log('VC_redist.x64 2015+  visual c++ redistrbutable never installed. installing...');
  end;
end;

有两点需要注意:

  1. 测试时卸载后记得手动删除一下注册表内的信息,不然会有信息残留
  2. 摊牌卸载安装测试时,改动一下 Result := RegQueryDWordValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64' 中的路径,因为有可能会有缓存导致测试的时候判断不准确

至于判断后的安装就简单一点了:

[Files] 节点说明安装包的位置

[Files]
Source: "{#DIST_PATH}\win-unpacked\resources\bin\VC_redist.x64.exe"; DestDir: "{tmp}\resources\bin"
Source: "{#DIST_PATH}\win-unpacked\resources\bin\vcredist_x64.exe"; DestDir: "{tmp}\resources\bin"

在 [code] 节点解压并执行安装

[code]
function InstallVC_redist2015_2022: Boolean;
var
  ResultCode: Integer;
begin
  ExtractTemporaryFiles('{tmp}\resources\bin\VC_redist.x64.exe')
  if not Exec(ExpandConstant('{tmp}\resources\bin\VC_redist.x64.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
  begin
    Log('Failed to execute VC_redist.x64.exe. Error code: ' + IntToStr(ResultCode));
  end;
end;

vcredist_x64 2013 照葫芦画瓢即可

我的 windows 版本

版本 Windows 10 企业版

版本号 21H2

安装日期 ‎2021/‎11/‎3

操作系统内部版本 19044.3086

体验 Windows Feature Experience Pack 1000.19041.1000.0

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
328 64
|
5月前
|
Linux 编译器 测试技术
【C++】CentOS环境搭建-快速升级G++版本
通过上述任一方法,您都可以在CentOS环境中高效地升级G++至所需的最新版本,进而利用C++的新特性,提升开发效率和代码质量。
352 63
|
5月前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
5月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
124 10
|
6月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
7月前
|
安全 编译器 C++
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
这些是Microsoft Visual C++不同版本的Redistributable安装包,用于32位系统,确保相关应用正常运行。它们提供C++运行时环境,简化部署流程,支持第三方库及框架,并确保应用兼容性。定期更新可修复问题并引入新功能。在空间有限或需解决程序冲突时可考虑删除,但需谨慎操作以防影响应用稳定性和兼容性。删除前请确认无应用依赖,并通过控制面板安全卸载。
558 1
Microsoft Visual C++ Redistributable的作用主要体现以及可以删除吗?
|
5月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
63 0
|
22天前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4天前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
30 6
|
24天前
|
编译器 C语言 C++
类和对象的简述(c++篇)
类和对象的简述(c++篇)