如何检测VC ++ 2008可再发行?

时间:2008-10-14 23:22:07

标签: visual-c++ redistributable

是否存在可以查找的注册表设置,以确定是否已安装Visual C ++可再发行组件,无论是独立还是作为Visual Studio 2008的一部分?我知道我可以启动VC ++ 2008可再发行安装程序并让它处理检测,但是如果我可以检查它并且如果可再发行组件已经在系统上则不打扰启动安装程序它看起来会更清晰。

如果没有可搜索的设置,这并不重要,因为这仅适用于我们软件新版本的初步安装程序。对于我们正在开发的基于Windows Installer的新安装程序,我们不需要它来替换旧技术安装程序,并将使用合并模块。

13 个答案:

答案 0 :(得分:19)

我认为当您使用不同的操作系统时,这些解决方案中的任何一个都无法提供帮助例如,MsiQueryProductState将始终使用Vista VC8.0返回-1

对于Windows 7的VC8.0 / 8.0 SP1 / 9.0为-1!因此,微软提供的GUID解决方案并不适用于所有情况

所以我想我被迫坚持使用%windir%\ winsxs方法并搜索

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

对于那些正在寻找所有GUID的人,这是我创建的列表:

Visual C ++ 2005运行时文件

* 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运行时文件

* 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安全更新运行时文件

* 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运行时文件

* 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运行时文件

* 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安全更新运行时文件

* 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}

答案 1 :(得分:16)

检查注册表:

  

VC ++ 2008(sp1):   HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\ {3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

  

VC ++ 2008(原创):   HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\ {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

答案 2 :(得分:6)

VC2005的最新版本:

Visual C ++ 2005 Service Pack 1可再发行软件包MFC安全更新

* 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

答案 3 :(得分:5)

又快又脏:

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

Loadlibrary将处理为您搜索路径。

答案 4 :(得分:4)

看起来像Microsoft-Developer提出的another solution使用MsiQueryProductState API,唉也依赖于GUID。

更新:代码昨天上线,似乎工作正常。以下是完成的工作:检查最新的已知GUID和路径²到哪里应该安装。如果两者都失败,则安装它。这似乎工作正常。

此外,它使用命令行参数“/ qb”安装,这意味着“无人看管但不可见”。关于这些参数,请参见this other blog post

FWIW,Microsoft Visual C ++ 2008 / VC90 SP1可再发行组件的GUID - 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

²路径: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

答案 5 :(得分:2)

检查$WINDIR\WinSxS\x86_Microsoft.VC90.CRT_*,例如,您是否正在检查Visual Studio 2008可再发行组件。

答案 6 :(得分:2)

我特意开源a Visual C++ project on Github that checks for VC++ redistributable DLLs,并在Apache 2.0许可下提供。

它有三种不同的方法来检查VC ++ 9和VC ++ 10运行时的可用性:

  1. 检查MsiQueryProductState API;
  2. 检查WinSxS文件夹的内容以查找匹配的产品目录;和
  3. 检查当前工作目录中VC ++ 9和VC ++ 10运行时的任何本地版本(并检查其内容。)
  4. 编辑:以下是实际使用它的示例:

     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;
    

    我在Apache 2.0下授权了crt-detector项目,所以请随意在自己的应用程序中使用它。

答案 7 :(得分:1)

对于遇到此问题的其他人

更新

1)如果安装了Visual Studio,则会出现所需的DLL,但“redist package”不存在,因此缺少注册表项。 (即这将给出假阴性)。但是,在这种情况下将redist安装在顶部是无害的。

2)redist的每个主要版本(VS2005 / VS2008,x86 / x64 / IA64和Service Pack的任意组合:SP1,ATL安全更新)具有不同的GUID。如果您希望在x86和x64 PC上部署应用程序,请务必小心。

3)如果您使用LoadLibrary或检查Dll文件,请确保定位正确的版本。如果您查找msvcrt80.dll(等)的“任意”副本,那么您将无法判断它是否是您的程序所链接的版本。

答案 8 :(得分:1)

“Microsoft Visual C ++ 2008 Service Pack 1可再发行软件包MFC安全更新(x86)”的产品代码为{9BE518E6-ECC6-35A9-88E4-87755C07200F}

答案 9 :(得分:0)

您可以检查WINDOWS \ WinSxS目录下的文件,以查看已安装的版本。通常可以同时安装许多版本,因此您可能需要检查已安装的特定版本。

答案 10 :(得分:0)

找到VC2008可再发行的注册表项。这是我的解决方案:

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;
    }
}

答案 11 :(得分:0)

我想使用以下值扩展GUID列表:

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(原创)
{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}

因此,请确定是否最好通过GUID检查VCredist的存在。

答案 12 :(得分:0)

最可靠的方法是将 MsiQueryProductState API与不同vcredist版本的GUID一起使用。

有效!

问候。