Visual c++ 如何检测Visual C++;已安装2017可再发行版本

Visual c++ 如何检测Visual C++;已安装2017可再发行版本,visual-c++,redistributable,vcredist,visual-c++-2015,visual-c++-2017,Visual C++,Redistributable,Vcredist,Visual C++ 2015,Visual C++ 2017,我的目标是安装VC++2015Redist,因为该软件是使用VS2015编写的。如果我能在一台机器上成功检测到VC++2017Redist,那么我将跳过VC++2015Redist的安装您解决了错误的问题。您正在尝试安装一个过时的可再发行版本,该版本仅适用于VS2015(工具集v140)。相反,请安装当前的VS2017可再发行工具(工具集v141)。它与VS2015向后兼容。2017年VC++可再发行安装升级/取代了2015年安装 Visual Studio 2017再发行版的安装升级并替换任何

我的目标是安装VC++2015Redist,因为该软件是使用VS2015编写的。如果我能在一台机器上成功检测到VC++2017Redist,那么我将跳过VC++2015Redist的安装

您解决了错误的问题。您正在尝试安装一个过时的可再发行版本,该版本仅适用于VS2015(工具集v140)。相反,请安装当前的VS2017可再发行工具(工具集v141)。它与VS2015向后兼容。

2017年VC++可再发行安装升级/取代了2015年安装 Visual Studio 2017再发行版的安装升级并替换任何现有的2015再发行版安装。我已经检查过了,2015年安装从“添加/删除程序”中消失,注册表值(见下文)更新了版本号。此外,2017年VC++可再发行版本与2015年版本具有二进制兼容性

通过检查下面描述的注册表项,可以检查是否安装了2015或2017。这是针对x64系统的,请查看32位系统中没有
wow6432节点的情况

钥匙: 适用于64位VC++可再发行版本

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
适用于32位VC++可再发行版本

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
32位和64位安装的属性和值相同(格式相同)。注册表使用值:

Value          2015       2017 
Name      Val. Data  Val. Data
--------  ---------  ---------
Major            14         14
Minor             0         13
Bld           23026      26020
请注意,随着新补丁的更新,2017年的@Minor和build(@Bld)编号将继续变化

我建议,如果检查是否至少安装了2015,只需检查密钥,@Major版本是14

如果检查2017年,如果它不存在,则打算进行升级,那么只需检查@Bld编号,如果它至少不是可以安装的版本,则继续安装当前2017年版本。请注意,@Minor和@Bld版本的未来更新是可能的——我有另一台安装了v14.11.25325的计算机,也是2017版本。

VC可再发行版现在可用。 如果您尝试安装“较旧”版本(例如仅2015年),如果您有任何较新版本(例如2017年),则会出现错误(本回复结束)

正如@CJBS所写,它将自己写入注册表,但遗憾的是,我注意到了另一个记录位置(所以也要检查它):

适用于32位VC++可再发行版本

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x86

适用于64位VC++可再发行版本

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64

我建议阅读@Bld DWord记录并进行比较,以确定是否需要更新版本:2015(Bld=23026)2017(Bld=26020)2019(Bld=27820)



:0x80070666-已安装此产品的另一个版本。此版本的安装无法继续…

但是。。。为什么?重点是什么?如果您的程序需要它,请随程序提供可再发行文件。如果你的程序没有安装,那么就不要安装。@DietrichEpp我想OP希望安装包检查是否已经安装了可再发行文件,在这种情况下,可以跳过该步骤。使用
/passive
标志运行redist安装程序。未验证,但这有帮助吗?您是否可以(尝试)运行一个简单的测试exe,它本身在返回0之前使用可再发行文件?我假设脚本或安装程序可以从exe调用中获取返回代码。这很可能也会失败,因为机器已经安装了VS2345可再发行版本,因此OP将处于与现在相同的情况(除非他在MS发布日使用最新的可再发行安装程序重新打包应用程序)。@Ped7g:True,但这是故意的。无法检测VS2345的注册表项。您尝试安装已知的最新版本。阻止过时的安装程序取决于未来的安装程序。所以最初问题的答案是,“他的安装程序失败了”。。。但这可能会由于各种原因而失败,并且由于最近安装的可分发系统而导致的失败可以忽略,因为它们应该是向后兼容的,但是不同的失败(如空间不足)不适合忽略。。。因此,如果OP将重新表述他的问题,他仍然处于有问题的状态,无法判断失败是否正常。(我也没有答案,我已经10多年没有与微软技术公司合作了,我只是好奇,而且我觉得有必要指出你的答案毫无意义)(就我而言,“被设计打破”是微软技术公司很容易接受的东西,所以我毫不奇怪:)@Ped7g:一般来说,您可以在安装时忽略此类故障。请注意,在从VC++2015升级时,一系列VC++2017 redist安装程序中存在一个错误,实际上删除了此密钥。发生这种情况时,我无法找到可靠的方法来检测VC++2017安装的安装。我使用以下路径检测x86 redist“HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\SERVITING\14.0\RuntimeAdditional\Install”
# Check VCRedist current version
$OS= if ( ${env:ProgramFiles(x86)} ) {"\WOW6432Node"} else {"\"}
    $vcredist = Get-ItemProperty -Path "HKLM:\SOFTWARE$OS\Microsoft\VisualStudio\14.0\VC\Runtimes\x86" -ErrorAction SilentlyContinue -ErrorVariable eVcRedist
if ($eVcRedist) {
    $Warning += @( "Abbyy FineReader 15 requires VCRedist." )
}
elseif (($vcredist.Bld -le 24215)) {
    $Warning += @( "Abbyy FineReader 15 requires VCRedist." )
}