How to detect if Visual C++ Redistributable for Visual Studio 2012 is installed?
I tried Google it and nobody has asked this question, surprise!
How to detect if Visual C++ Redistributable for Visual Studio 2012 is installed?
I tried Google it and nobody has asked this question, surprise!
It depends on what version you are using. These two 2012 keys have worked well for me with their corresponding versions to download for Update 4. Please be aware that some of these reg locations may be OS-dependent. I collected this info from a Windows 10 x64 box. I\'m just going to go ahead and dump all of these redist versions and the reg keys I search for to detect installation.:
Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180
Direct Download URL: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE
Microsoft Visual C++ 2005 Redistributable (x86)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\c1c4f01781cc94c4c8fb1542c0981a2a
Configuration: x86
Version: 6.0.2900.2180
Direct Download URL: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE
Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161 (SP1)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\67D6ECF5CD5FBA732B8B22BAC8DE1B4D
Configuration: x64
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
Direct Download URL: https://download.microsoft.com/download/2/d/6/2d61c766-107b-409d-8fba-c39e61ca08e8/vcredist_x64.exe
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 (SP1)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
Direct Download URL: https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe
Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\1926E8D15D0BCE53481466615F760A7F
Configuration: x64
Version: 10.0.40219.325
Direct Download URL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe
Microsoft Visual C++ 2010 Redistributable (x86)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Products\\1D5E3C0FEDA1E123187686FED06E995A
Configuration: x86
Version: 10.0.40219.325
Direct Download URL: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
Microsoft Visual C++ 2012 Redistributable (x64)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6}
Configuration: x64
Version: 11.0.61030.0
Direct Download URL: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe
Microsoft Visual C++ 2012 Redistributable (x86)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
Configuration: x86
Version: 11.0.61030.0
Direct Download URL: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe
version caveat: Per user Wai Ha Lee\'s findings, \"...the binaries that come with VC++ 2012 update 4 (11.0.61030.0
) have version 11.0.60610.1
for the ATL and MFC binaries, and 11.0.51106.1
for everything else, e.g. msvcp110.dll and msvcr110.dll...\"
Microsoft Visual C++ 2013 Redistributable (x64)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{050d4fc8-5d48-4b8f-8972-47c82c46020f}
Configuration: x64
Version: 12.0.30501.0
Direct Download URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe
Microsoft Visual C++ 2013 Redistributable (x86)
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{f65db027-aff3-4070-886a-0d87064aabb1}
Configuration: x86
Version: 12.0.30501.0
Direct Download URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe
Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{d992c12e-cab2-426f-bde3-fb8c53950b0d}
Configuration: x64
Version: 14.0.24215.1
Direct Download URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe
Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215
Registry Key: HKLM\\SOFTWARE\\Classes\\Installer\\Dependencies\\{e2803110-78b3-4664-a479-3611a381656a}
Configuration: x86
Version: 14.0.24215.1
Direct Download URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe
Caveat: There\'s either a new 2017 registry convention being used, or it hasn\'t been finalized, yet. As I\'m guessing the upper-most keys of:
[HKEY_CLASSES_ROOT\\Installer\\Dependencies\\,,amd64,14.0,bundle]
and
[HKEY_CLASSES_ROOT\\Installer\\Dependencies\\,,x86,14.0,bundle]
are subject to change, or at least have different nested GUIDs, I\'m going to use list the key that ends with a GUID.
Microsoft Visual C++ 2017 Redistributable (x64) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\\Installer\\Dependencies\\VC,redist.x64,amd64,14.16,bundle\\Dependents\\{427ada59-85e7-4bc8-b8d5-ebf59db60423}]
Configuration: x64
Version: 14.16.27012.6
Direct Download URL: https://download.visualstudio.microsoft.com/download/pr/9fbed7c7-7012-4cc0-a0a3-a541f51981b5/e7eec15278b4473e26d7e32cef53a34c/vc_redist.x64.exe
Microsoft Visual C++ 2017 Redistributable (x86) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\\Installer\\Dependencies\\VC,redist.x86,x86,14.16,bundle\\Dependents\\{67f67547-9693-4937-aa13-56e296bd40f6}]
Configuration: x86
Version: 14.16.27012.6
Direct Download URL: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe
Changelog:
December 14th, 2018 -- Updated MSVC2008 for Service Pack 1\'s 9.0.30729.6161
update per Jim Wolff\'s findings
November 27th, 2018 -- Updated info for MSVC2017 v. 14.16
September 12th, 2018 -- Added version caveat to 2012 Update 4 per Wai Ha Lee\'s findings
August 24th, 2018 -- Updated 2017\'s version for 14.15.26706, the updated Visual C++ dependencies packaged with VS 2017 15.8.1
May 16th, 2018 -- Updated 2017\'s version for 14.14.26405.0 as the new C++ 2017 entry
September 8th, 2017 -- Updated 2017\'s version for 14.11.25325.0 as the new Visual C++ 2017 entry
April 7th, 2017 -- Updated 2017\'s version of 14.10.25008.0 as the new Visual C++ 2017 entry
October 24th, 2016 -- Updated 2015\'s version info for 14.0.24215.1
August 18th, 2016 -- Updated 2015\'s version info for 14.0.24212
May 27th, 2016 -- Updated info for MSVC2015 Update 2
Please contact me here if any of these become outdated.
Try
HKLM\\SOFTWARE\\Microsoft\\DevDiv\\VC\\Servicing\\11.0
as a starting point. I will be using this as a check for installing the VC++ 11 (VS 2012) runtime.
You can check for the Installed
value to be 1
in this registry location: HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x86
on 64-bit systems. In code that would result in accessing registry key HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x86
. Notice the absence of Wow6432Node
.
On a 32-bit system the registry is the same without Wow6432Node
: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x86
There is no installcheck element in the bootstrapper package manifest shipped with Visual C++. Guess Microsoft wants to always install if you set it as a prerequisite.
Of course you can still call MsiQueryProductState to check if the VC redist package is installed via MSI, The package code can be found by running
wmic product get
at command line, or if you are already at wmic:root\\cli, run
product where \"Caption like \'%C++ 2012%\'\"
The answer to this simple questions is unfortunately not a simple one, but working in 100% of all systems, and even extendable to the numerous .net frameworks.
The complexity comes from the fact that there are (and were) many VC runtimes revisions which could lead to the case that although VC10 runtimes were installed, their build number was not recent enough so your EXE wouldn\'t start unless you either installed the very exact runtimes you required or one of the newer runtimes which enable this and previous versions for the same major version to run with it (the side-by-side hell). Also, if you have a 64 bit EXE, you will have to check for both, the 32 AND 64 bit runtimes.
That said, the only reliable way to determine whether the runtimes for your EXE are installed is to attempt to run the EXE - or a another EXE which is built with the same settings as your main EXE and whose only purpose is to do - nothing. Just run (which means the runtimes are installed) or fail to run (when not installed).
I did the following for an installer which required the VC10 32 and 64 bit runtimes installed: The installer attempts to launch all dummy EXEs and if it succeeds, the corresponding runtime is considered to be installed. This also resolves the 32/64 bit scenario.
This, by the way, works also to determine if the proper .net framework is installed, which is very tricky in Windows 8 and 10, as the downloadable built-in .net 3.5 support also supports the .net versions 3.0 and 2.0 - there are no registry entries for these. (And worse, you cannot even use the standard framework installers here, you must use the built-in support and download it via Windows, or rebuild your app with .net 4, but that\'s another story).
The C++ dummy EXE can be built using a project with the following code (and another one in a 64 bit configuration if necessary):
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Remember to set the project\'s properties Use of MFC to Use MFC in a shared DLL. The executables will be around 4KB in size - a small price to pay for a sure result.
To give your users a nice installation experience, you could do the following (sample code is for NSIS):
Function TryLaunchApplication
Pop $1 ; pathname
nsExec::Exec $1
Pop $0
${If} $0 == \"error\"
${OrIf} $0 != 0
Push 0
${Else}
Push 1
${EndIf}
FunctionEnd
and call it in a function, e.g. CheckRuntimes
Function CheckRuntimes
; Try to execute VC++ 10 application (32 bit)
Push \"Vc10RuntimeCheckerApp.exe\"
Call TryLaunchApplication
Pop $Vc10RuntimesFound
; Add 64 bit check if required.
; Remember to try running the 64 bit EXE only on a 64 bit OS,
; which requires further checks.
; Try to execute .net application
Push \"DotNetRuntimeCheckerApp.exe\"
Call TryLaunchApplication
Pop $DotNetFrameworkFound
FunctionEnd
Then launch the runtime check e.g. when leaving the Welcome page and cache the result, so you don\'t have to re-check every time the user clicks on the \"Back\" and \"Next\" button.
Next, make a read-only section in the install tree and pre-select or unselect it on the a function which is executed before the Components page is shown.
This will make sure that the installation of each missing runtime component is mandatory, and is skipped if it is already present.
Since Visual Studio 2010 and later stopped using WinSxS, it may be enough to just check for %windir%\\system32\\msvcr110.dll. If you want to verify you have a new enough version, you can check whether the file version is 11.0.50727.1 (VS2012 RTM) or 11.0.51106.1 (VS2012 Update 1).
For me this location worked: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\DevDiv\\vc\\Servicing\\11.0\\RuntimeMinimum\\Version
Check what version you have after you installed the package and use that as a condition in your installer. (mine is set to 11.0.50727 after installing VCred).
Just go to Control Panel > Programs and Features, and they all appear listed there.
I\'m no expert and this answer is pretty simple compared to what people are answering (checking registry), so I\'m not sure if it\'s the correct answer but it did the trick for me.
if RegRead(\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\VC\\VCRedist\\x86\",\"Installed\") = 0 Then
if RegRead(\"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x86\",\"Installed\") = 0 Then
I\'ve succeded doing this with InnoSetup.
I checked the existence of registry key:
HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes
If uninstalled, it does not exist. If installed, it exists.
By the way, it could also be in the Wow6432Node:
HKLM\\SOFTWARE\\Wow6432Node\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes
Checking the install state for the product via MsiQueryProductState is pretty much equivalent to checking the registry directly, but you still need the GUID for the ProductCode.
As mentioned elsewhere, one drawback with these approaches is that each update has its own ProductCode!
Thankfully, MSI provides an UpgradeCode which identifies a \'family\' of products. You can use orca to open up one of the MSIs to extract this information. For example, the UpgradeCode for VS2015\'s redistributable is {65E5BD06-6392-3027-8C26-853107D3CF1A}
You can use MsiEnumRelatedProducts to get all Product IDs for that UpgradeCode. In practice, since each redist update replaces the previous one, this will only yield one ProductCode - such as {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}
for VS2015 Update 2 x86.
Regardless, you can then check the version via MsiGetProductInfo(productCode, INSTALLPROPERTY_VERSIONSTRING, ...) or similar functions to compare with the version you want, eg to check for an equivalent or later version.
Note that within a C++ application, you can also use _VC_CRT_MAJOR_VERSION
, _VC_CRT_MINOR_VERSION
, _VC_CRT_BUILD_VERSION
if you #include <crtversion.h>
-- this way you can determine calculate the CRT version that your binary was built with.
This PowerShell code should do the trick
Get-ItemProperty
HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Format-Table –AutoSize
I needed the same thing, and although AFAIK this cannot be done programmatically, it worked for me.
I just went to Start --> Uninstall a program, and scrolled down until I found the VC++ redistributable, which includes a version number. Googling the version number, told me it belongs to VS2012 SP1.
Old question but here is the approach we have used ever since Visual Studio 2005 with success. I just tested it using Visual Studio 2012 Update 4 as well (since we are finally updating our software from 2010 to 2012).
Since the Visual C++ Redistributable packages register their uninstaller with windows (so it shows up in the Control Panel \"Programs and Features\" list), we simply check for the Display Name of the uninstaller key in the registry.
Here is the relevant NSIS code:
ReadRegStr $0 HKLM \"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\\\" \"DisplayName\"
StrCmp $0 \"Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030\" vs2012redistInstalled
DetailPrint \"Microsoft Visual C++ 2012 Update 4 Redistributable not found!\"
DetailPrint \"Downloading from www.mywebsite.com\"
; insert applicable download code here
ExecWait \'\"<downloaded redist exe>\" /promptrestart /passive\'
vs2012redistInstalled:
Note that since our installer is a 32bit exe, windows handles determining if the registry key is actually in the virtualized Wow6432Node instead of the above location so the above code works on both 64bit and 32bit windows installs without having to check both keys explicitly.
Also note that to update the above code to a different version of the VC++ Redist, simply change the GUID in the registry key path and the display name to whatever you need.
While this may not be the recommended method, It has worked on 10,000+ machines over the past 10 years running every flavor of windows from XP/XP64 Through Windows 10 using redists for 2005, 2010, 2010sp1, and now 2012u4.
I came across this question looking for an answer in the context of checking for the Visual C++ redistributable as part of an MSI installer created by WiX.
I didn\'t like how the GUID\'s change with version and operating system, so I ended up creating a custom action written in C# to check for the Visual C++ redistributable.
Everything below is specifically for Visual C++ 2015 Redistributable (x64), but it can be easily modified for any version.
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32;
namespace CustomActions
{
public class DependencyChecks
{
[CustomAction]
public static ActionResult IsVC2015RedistInstalled(Session session)
{
session.Log(\"Begin Visual C++ 2015 Redistributable installation check.\");
var dependenciesKey = Registry.LocalMachine.OpenSubKey(\"SOFTWARE\\\\Classes\\\\Installer\\\\Dependencies\");
foreach(var subKey in dependenciesKey.GetSubKeyNames())
{
var dependency = dependenciesKey.OpenSubKey(subKey);
var displayName = (string)dependency.GetValue(\"DisplayName\");
if(displayName != null)
{
if (displayName.Contains(\"Microsoft Visual C++ 2015 Redistributable (x64)\"))
{
session.Log(\"Visual C++ 2015 Redistributable is installed.\");
return ActionResult.Success;
}
}
}
session.Log(\"Visual C++ 2015 Redistributable is not installed.\");
session.Message(InstallMessage.Error, new Record(1, \"This application requires Visual C++ 2015 Redistributable. Please install, then run this installer again. https://www.microsoft.com/en-us/download/details.aspx?id=53587\"));
return ActionResult.Failure;
}
}
}
Then in the wxs file
<Binary Id=\'VC2015RedistCheck\' SourceFile=\'!(wix.ResourcesDir=resources)\\CustomActions.CA.dll\'/>
<CustomAction
Id=\'VC2015RedistCheckAction\'
Execute=\'immediate\'
BinaryKey=\'VC2015RedistCheck\'
DllEntry=\"IsVC2015RedistInstalled\"
Return=\'check\'/>
<InstallExecuteSequence>
<Custom Action=\'VC2015RedistCheckAction\' After=\'InstallInitialize\'/>
</InstallExecuteSequence>
I would check the Installed
value of
HKLM\\SOFTWARE\\[WOW6432Node]\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{VCRedist_GUID}
key
VC++ 2012 (x86)
is {33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
WOW6432Node
will be present or not depending on the VC++ redist
productWhat most people miss is the required /reg:32
to check for the key on Windows x64.
See Microsoft Help article on this subject.
Here is a script that demonstrates how to correctly check for Visual C++ Redistributable for Visual Studio 2012 Update 4.
@ECHO OFF
:Author
REM \"CREATED BY WAR59312\"
REM \"FEB 7th 2017\"
REM Clear Screen
CLS
TITLE Detect Visual C++ 2012 Redistributables
REM This Batch Script Detects If Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
:DetectWindowsOS
REM Are We Running On x86 Or x64
IF NOT DEFINED PROCESSOR_ARCHITEW6432 (
IF %PROCESSOR_ARCHITECTURE% EQU x86 (
REM Windows Is x86
GoTo Check32Bit
) ELSE (
REM Windows Is x64
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)) ELSE (
REM Windows Is Unknown But Assume x64 To Be Safe
SET NeededFor64BitOnly=/reg:32
GoTo Check64Bit
)
:Check64Bit
REM Checks If Visual C++ 64Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x64\" /v \"Version\" %NeededFor64BitOnly% 2>NUL^ | (
FIND \"v11.0.61030.00\" >NUL
) && (
ECHO.
ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
ECHO.
GoTo Check32Bit
) || (
ECHO.
ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
ECHO.
GoTo Check32Bit
)
:Check32Bit
REM Checks If Visual C++ 32Bit Redistributable for Visual Studio 2012 Update 4 Is Installed
REG QUERY \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\11.0\\VC\\Runtimes\\x86\" /v \"Version\" %NeededFor64BitOnly% 2>NUL^ | (
FIND \"v11.0.61030.00\" >NUL
) && (
ECHO.
ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed
) || (
ECHO.
ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed
)
:END
ECHO.
PAUSE
EXIT
you can search in registry.Actually I do\'nt have vs2012 but I have vs2010.
There are 3 different (but very similar) registry keys for each of the 3 platform packages. Each key has a DWORD value called “Installed” with a value of 1.
HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\VC\\VCRedist\\x86
HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\VC\\VCRedist\\x64
HKLM\\SOFTWARE\\Microsoft\\VisualStudio\\10.0\\VC\\VCRedist\\ia64
You can use registry function for that......