The latest supported Visual C++ downloads
运行时检测方法
我可以找到几种方法来检测 Visual C++ 运行时的存在。
-
注册表
-
文件存在和版本检查
-
MSI API
- 您可以通过查找产品 GUID 来检测是否安装了特定 MSI
- 可靠,但难以跟踪所有产品 GUID(不同版本)
-
更新:您也可以使用如下所述的升级代码。它应该在发布和更新之间保持稳定(对于每个主要版本,也可能在主要版本之间)。
-
Fall-Over EXE?
- 建议使用 EXE,具体取决于运行时
- 启动它并失败意味着运行时不存在或损坏
好与坏 - 评估:Option 1 似乎很容易受到攻击,因为部署运行时的合并模块变体可能不会编写这些键。 Option 3 可能运行良好,但很难跟踪所有 GUID。 Option 4 似乎已经失败,因为较新的运行时删除了某些注册表项。虽然现在已经修复,但它可能会重新出现。
文件版本存在/版本检查
我看的越多,我就越开始认为您必须检查实际文件本身,并可能检查正确的文件版本。 System32 文件夹(64 位版本)和 SysWOW64 文件夹(32 位版本)中的文件 vcruntime140.dll? See files list towards bottom here.
只是添加一个安全保存的链接。
测试 VBScript - 仅用于测试目的(脚本有时会被防病毒软件阻止):
Set fso = CreateObject("Scripting.FileSystemObject")
MsgBox fso.GetFileVersion("C:\Windows\System32\vcruntime140.dll")
您可以在 MSI 文件中使用 AppSearch 检测文件的存在和版本。
下面是我写的一些其他的东西,只是把它留在里面。
VCredist
似乎 Visual C++ Redistributable Packages (VCRedist_x86.exe, VCRedist_x64.exe) - 这是部署运行时的推荐方式- 检查以下注册表项以确定实际安装的运行时版本:
HKLM\SOFTWARE\Microsoft\VisualStudio\<version>\VC\Runtimes\
子键 x86 和 x64 似乎都包含设置为 1 的“Installed”值strong> 安装运行时。我会假设 - 没有时间测试它 - 然后你可以检查:
-
HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64 Installed = 1
-
HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86 Installed = 1
合并模块:经过简单检查,这些值似乎不是由也可用于分发此运行时的合并模块写入的。我现在没有时间或方法来正确检查。
令人惊讶的是,2015 版和 2017 版运行时都写入了 14.0 密钥 - 因为它们是二进制兼容的。 如果安装了 2017 版,则 VCRedist 可执行文件将返回错误,因为不需要安装。确实很奇怪。但为了您的目的,这应该是无关紧要的。 Source.
MSI API - 检索产品代码
更新:installer.ProductState - 正常安装状态是5:
我在写以下内容时忘记了ProductState property。
您可以使用两行代码检查已安装的产品,如果您
有实际的产品代码:
Dim installer : Set installer = CreateObject("WindowsInstaller.Installer")
MsgBox installer.ProductState("{00000000-0000-0000-0000-000000000001}")
这里还有另一种方法:MSDN: How to programmatically check for the presence of a Windows Installer-based product by using its product code。
提示:我不会使用这种方法,因为产品更新时产品代码会频繁更改。因此我更喜欢
检查核心运行时文件的文件版本。这似乎更
未来可靠(前提是版本解析正确完成
并且可靠——不要自己动手)。
样机:
Public installer
Set installer = CreateObject("WindowsInstaller.Installer")
' Don't have the 2015 GUID
VC2015 = CheckForProductCode("{00000000-0000-0000-0000-000000000000}")
VC2017 = CheckForProductCode("{C77195A4-CEB8-38EE-BDD6-C46CB459EF6E}")
MsgBox "VC2015: " & CStr(VC2015) & vbCrLf & "VC2017: " & CStr(VC2017)
Function CheckForProductCode(productcode)
CheckForProductCode = False
For Each product In installer.ProductsEx("", "", 7)
If(LCase(productcode) = LCase(product.ProductCode)) Then
CheckForProductCode = True
Exit For
End If
Next
End Function
基于Zett42's suggestion更新,列举共享相同升级代码的产品:
Set installer = CreateObject("WindowsInstaller.Installer")
' Enumerate all products related to "Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148"
' {AA783A14-A7A3-3D33-95F0-9A351D530011} is the upgrade code
Set upgrades = installer.RelatedProducts("{AA783A14-A7A3-3D33-95F0-9A351D530011}")
For Each u In upgrades
MsgBox u, vbOKOnly, "Product Code: "
Next
部署 Visual Studio C++ 运行时
除了检测之外,还有多种分发 Visual Studio C++ 运行时的方法:
- 静态链接
-
Visual C++ 可再发行包
-
VCRedist_x86.exe、VCRedist_x64.exe 或 VCRedist_arm.exe
Program Files(x86)\Microsoft Visual Studio\2017\edition\VC\Redist\MSVC\lib-version
-
可再发行的合并模块 (
.msm files)
-
本地应用程序文件夹
- 将 DLL 复制到本地应用程序文件夹
- 出于维修原因(更新、安全修复),不推荐
安全保存链接:
旧答案
有这个旧帖子。我不太喜欢直接读取注册表,让我看看我是否能找到更可靠的方法,但也许同时看看:Detect if Visual C++ Redistributable for Visual Studio 2012 is installed
再多一个链接,如何找到已安装产品的Windows Installer产品代码:How can I find the product GUID of an installed MSI setup?