How to detect VC++ 2008 redistributable?
Asked Answered
L

13

33

Is there a Registry setting that I can look for to determine whether or not the Visual C++ redistributable is installed, whether standalone or as part of Visual Studio 2008? I know that I could launch the VC++ 2008 redistributable installer and let it handle the detection, but it would look cleaner if I can check for it and not bother launching the installer if the redistributable is already on the system.

It's no biggie if there is no setting to search for, as this is just for the preliminary installers that we have for the new version of our software. We won't need it for the new Windows Installer-based installers that we are working on that will replace the old tech ones and will use the merge modules.

Lucianaluciano answered 14/10, 2008 at 23:22 Comment(0)
S
16

Check the registry:

VC++2008 (sp1): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

or

VC++2008 (original): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

Stesha answered 18/3, 2009 at 10:24 Comment(2)
I found out this is a bad assumption, since there are different versions (and thus GUIDs) for a such a Release.Pandora
Don't use guids to check for installation! On my XP box, the VC2008 SP1 redist I just installed has a different guid than the one listed.Dewitt
G
19

I don't think any of those solution can help when your using different OS ! For ex, MsiQueryProductState will always returned -1 using Vista VC8.0

while -1 for VC8.0/8.0 SP1/9.0 with Windows 7 ! So the GUID solution that microsoft provided, doesn't work in all cases

so i guess i'm forced to stuck with the %windir%\winsxs approach and search for

  • x86_Microsoft.VC80.CRT*
  • x86_Microsoft.VC90.CRT*

For those who are looking for all GUIDs, Here is a list i created:

Visual C++ 2005 runtime files

* VC 8.0 (x86) - {A49F249F-0C91-497F-86DF-B2585E8E76B7}
* VC 8.0 (x64) - {6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}
* VC 8.0 (ia64) - {03ED71EA-F531-4927-AABD-1C31BCE8E187}

Visual C++ 2005 SP1 runtime files

* VC 8.0 SP1 (x86) - {7299052B-02A4-4627-81F2-1818DA5D550D}
* VC 8.0 SP1 (x64) - {071C9B48-7C32-4621-A0AC-3F809523288F}
* VC 8.0 SP1 (ia64) - {0F8FB34E-675E-42ED-850B-29D98C2ECE08}

Visual C++ 2005 SP1 ATL Security Update runtime files

* VC 8.0 SP1 ATL Patch (x86) - {837B34E3-7C30-493C-8F6A-2B0F04E2912C}
* VC 8.0 SP1 ATL Patch (x64) - {6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}
* VC 8.0 SP1 ATL Patch (ia64) - {85025851-A784-46D8-950D-05CB3CA43A13}

Visual C++ 2008 runtime files

* VC 9.0 (x86) - {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
* VC 9.0 (x64) - {350AA351-21FA-3270-8B7A-835434E766AD}
* VC 9.0 (ia64) - {2B547B43-DB50-3139-9EBE-37D419E0F5FA} 

Visual C++ 2008 SP1 runtime files

* VC 9.0 SP1 (x86) - {9A25302D-30C0-39D9-BD6F-21E6EC160475}
* VC 9.0 SP1 (x64) - {8220EEFE-38CD-377E-8595-13398D740ACE}
* VC 9.0 SP1 (ia64) - {5827ECE1-AEB0-328E-B813-6FC68622C1F9}

Visual C++ 2008 SP1 ATL Security Update runtime files

* VC 9.0 SP1 ATL (x86) - {1F1C2DFC-2D24-3E06-BCB8-725134ADF989}
* VC 9.0 SP1 ATL (x64) - {4B6C7001-C7D6-3710-913E-5BC23FCE91E6}
* VC 9.0 SP1 ATL (ia64) - {977AD349-C2A8-39DD-9273-285C08987C7B}
Granddaughter answered 21/5, 2010 at 7:36 Comment(2)
You can check for these in the registry under the Uninstall key. For example VC2008SP1 x86 on a 64 bit machine = HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{9A25302D-30C0-39D9-BD6F-21E6EC160475}Stressful
Note for those that may be copying the path to the registry path posted by @xt1, it contains a Zero-width non-joiner (‌) and a Zero-width space (​) in the Uninstall portion of the path, that will need to be removed.Eulalie
S
16

Check the registry:

VC++2008 (sp1): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

or

VC++2008 (original): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

Stesha answered 18/3, 2009 at 10:24 Comment(2)
I found out this is a bad assumption, since there are different versions (and thus GUIDs) for a such a Release.Pandora
Don't use guids to check for installation! On my XP box, the VC2008 SP1 redist I just installed has a different guid than the one listed.Dewitt
F
6

Latest one for VC2005:

Visual C++ 2005 Service Pack 1 Redistributable Package MFC Security Update

* VC 8.0 SP1 MFCLOC Patch (x86) - {710F4C1C-CC18-4C49-8CBF-51240C89A1A2}
* VC 8.0 SP1 MFCLOC Patch (x64) - {AD8A2FA1-06E7-4B0D-927D-6E54B3D31028}
* VC 8.0 SP1 MFCLOC Patch (ia64) - {C2F60BDA-462A-4A72-8E4D-CA431A56E9EA}

8.0.50727.6195

http://www.microsoft.com/downloads/details.aspx?familyid=AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

Fournier answered 1/10, 2011 at 11:11 Comment(2)
Thank you very much! I think the version is 8.0.61001 for the MFC security update. Am I right?Begin
Yes, DL page says "A security issue has been identified leading to MFC application vulnerability in DLL planting due to MFC not specifying the full path to system/localization DLLs".Fournier
C
5

Quick and dirty:

if (LoadLibrary(L"msvcrt80.dll")!=NULL)
{
  // it is installed
}

Loadlibrary will handle searching the paths for you.

Cristiano answered 15/10, 2008 at 0:0 Comment(2)
One problem with this approach is that you have to do this for each DLL that you want to use. The presence of one does not guarantee the presence of any of the others; a clever enough person could diddle the Registry to "install" just one of the DLLs.Lucianaluciano
That would be clever would it? Seems like a stupid thing to do if you ask meCristiano
P
5

looks like there is another solution proposed by a Microsoft-Developer, using MsiQueryProductState API, alas also relying on the GUIDs.

Update: The code went live yesterday and seems to be working fine. Here is what is beeing done: It is checked for the latest-known-to-me GUID AND the path² to-where-it-is-supposed-to-be-installed. If both fails, it is installed. This seems to work fine.

Additionally, it is installed with the command line arguments "/qb" which means "unattended but not invisible". See this other blog post about those params.

FWIW, GUIDs for Microsoft Visual C++ 2008 / VC90 SP1 Redistributable - x86 9.0.30729

  • 64bit 30729.17: 8220EEFE-38CD-377E-8595-13398D740ACE
  • 32bit 30729.17: 9A25302D-30C0-39D9-BD6F-21E6EC160475
  • 32bit 30729.01: 6AFCA4E1-9B78-3640-8F72-A7BF33448200

² The path: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

Pandora answered 9/4, 2009 at 15:27 Comment(0)
E
2

Check for $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_* if, for example, you're checking for the Visual Studio 2008 redistributable.

Elohim answered 15/10, 2008 at 5:51 Comment(4)
One problem with this approach is that you have to do this for each DLL that you want to use. The presence of one does not guarantee the presence of any of the others; a clever enough person could diddle the Registry to "install" just one of the DLLs.Lucianaluciano
A "clever" enough person could fake out any test you can possibly imagine - it really doesn't seem like it is worth the trouble trying to outthink thatCristiano
Check for the directory name. It's all you need. The DLL redistribution kit should install all the relevant DLLs or none at all.Elohim
just one thing, VS2008 is VC90 not vc80.Ezechiel
S
2

I open-sourced a Visual C++ project on Github that checks for VC++ redistributable DLLs specifically and made it available under the Apache 2.0 license.

It has three different methods for checking for the availability of VC++9 and VC++10 runtimes:

  1. Checks the MsiQueryProductState APIs;
  2. Inspect the contents of the WinSxS folder for matching product directories; and
  3. Checks the current working directory for any local versions of the VC++9 and VC++10 runtimes (and inspects their contents.)

edit: Here's a sample of what using it actually looks like:

 wcout << _T("Checking for the availability of VC++ runtimes..") << endl;
 wcout << _T("----------- Visual C++ 2008 (VC++9) -----------") << endl;
 wcout << _T("Visual C++ 2008 (x86) ? ") << (IsVC2008Installed_x86() ? _T("true") : _T("false")) << endl;
 wcout << _T("Visual C++ 2008 (x64) ? ") << (IsVC2008Installed_x64() ? _T("true") : _T("false")) << endl;
 wcout << _T("Visual C++ 2008 SP1 (x86) ? ") << (IsVC2008SP1Installed_x86() ? _T("true") : _T("false")) << endl;
 wcout << _T("Visual C++ 2008 SP1 (x64) ? ") << (IsVC2008SP1Installed_x64() ? _T("true") : _T("false")) << endl;

I licensed the crt-detector project under Apache 2.0, so feel free to use it in your own applications.

Swoosh answered 14/11, 2013 at 5:23 Comment(0)
M
1

Update for anyone else hitting this problem:

1) If you have Visual Studio installed, the required DLLs will be present, but the "redist package" is not, so the registry keys are missing. (i.e. this will give a false negative). However, installing the redist over the top in this situation is harmless.

2) Every major release of the redist (Any combination of VS2005/VS2008, x86/x64/IA64, and service packs: SP1,ATL security update) has a different GUID. Take care if you are expecting to deploy your application on both x86 and x64 PCs.

3) If you use LoadLibrary or a check for Dll files, make sure you target the correct version. If you look for "any" copy of msvcrt80.dll (etc) then you won't be able to tell if it is the version your program was linked to.

Marek answered 11/9, 2009 at 12:55 Comment(0)
L
1

Product code for "Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package MFC Security Update (x86)" is {9BE518E6-ECC6-35A9-88E4-87755C07200F}

Lahomalahore answered 21/10, 2011 at 13:24 Comment(0)
H
0

You can check for the files under the WINDOWS\WinSxS directory to see which versions you have installed. Often many versions can be installed at one time so you might need to check the specific versions you have installed.

Hassiehassin answered 14/10, 2008 at 23:29 Comment(0)
M
0

Found registry entry for VC2008 redistributable. Here is my solution:

BOOL IsVC2008RedistInstalled(LPCTSTR pLogFile)
{
    TCHAR szLogEntry[256];
    memset(szLogEntry, '0', sizeof(szLogEntry));
    HKEY hKey;
    LONG lErr;

    TCHAR csid[256];
    _stprintf( csid, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9A25302D-30C0-39D9-BD6F-21E6EC160475}"));
    lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csid, 0, KEY_QUERY_VALUE, &hKey);
    if (lErr == ERROR_SUCCESS)
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was installed before.\n"));
    toFile(pLogFile, szLogEntry);
    return TRUE;
    }
    else
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was not installed before. %ld\n"), lErr);
    toFile(pLogFile, szLogEntry);
    return FALSE;
    }
}
Marti answered 29/4, 2009 at 23:41 Comment(0)
E
0

I'd like to extend the GUID list with the following values:

32bit 30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32bit 30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64bit 30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64bit 30729.01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}
VC++2008 (sp1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
VC++2008 (original)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
IA64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}
32bit 30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}
Visual Studio 2008 Professional SP1
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}
32bit 30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

So please decide, whether it's a good idea to check the presence of VCredist by GUIDs.

Eda answered 13/10, 2009 at 20:5 Comment(0)
D
0

The surest way is using the MsiQueryProductState API with the GUID of the different vcredist versions.

It works!

Regards.

Denicedenie answered 25/8, 2011 at 11:32 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.