如何检测是否需要安装VCRedist?

时间:2009-04-08 16:58:22

标签: visual-c++ installation redistributable

我的问题与this one非常相似,但答案对我不起作用。

软件我维护设置取决于VC ++ 2008(精确地说是SP1),因此我需要找到一个安装VCRedist的解决方案(如果尚未安装)。 我理解正确的方法是使用合并模块构建msi,但它不在我手中。

我所指的重复问题(已接受的问题)的答案对我不起作用,因为每个小版本(例如9.0.30729.01 vs 9.0.30729.17)都有正确的GUID,我无法猜测或预测对于未来的版本。此外,我认为这不会检测Visual Studios,因此当它已经在开发者机器上时不必要地安装VCRedist Package。我不想让任何人对此产生任何影响,当然不是那些已经安装了DevStudio的人。

现在另一个答案说我应该查看像$WINDIR\WinSxS\x86_Microsoft.VC80.CRT_这样的WinSxs文件夹,但是这还没有帮助我暗示SP1,或者此时我还缺少什么?是否有一个带有内部和“外部”版本号的表格,所以我可以暗示某个次要版本号?

我无法相信微软没有为这种情况提供任何东西,但是现在搜索互联网的时间已经太长了,现在让我回到了好的地方:')

4 个答案:

答案 0 :(得分:13)

对于Visual Studio C ++ 2010,things got a bit easier

  

与Visual C ++ 2005和2008可再发行组件包不同,有一些注册表项可用于检测Visual C ++ 2010可再发行组件包的存在。

     

Visual C ++ 2010可再发行包检测注册表值

     

Visual C ++ 2010 Redistributable Package(x86)

     

[HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ VisualStudio的\ 10.0 \ VC \ VCRedist \ 86]   已安装= 1(REG_DWORD)

     

Visual C ++ 2010可再发行组件包(x64)

     

[HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ VisualStudio的\ 10.0 \ VC \ VCRedist \ 64]   已安装= 1(REG_DWORD)

     

Visual C ++ 2010 Redistributable Package(ia64)

     

[HKEY_LOCAL_MACHINE \ SOFTWARE \微软\ VisualStudio的\ 10.0 \ VC \ VCRedist \ IA64]   已安装= 1(REG_DWORD)

注意:您需要在64位操作系统上检查Wow6432Node。 (HKLM \ SOFTWARE \ Wow6432Node \微软....)

如果你喜欢旧版本,这里是GUID

Visual C ++ 2010可再发行组件包产品代码

  • Visual C ++ 2010可再发行组件包(x86) - {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • Visual C ++ 2010可再发行组件包(x64) - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • Visual C ++ 2010可再发行组件包(ia64) - {C1A35166-4301-38E9-BA67-02823AD72A1B}

Visual C ++ 2010 SP1可再发行软件包产品代码

  • Visual C ++ 2010 SP1可再发行组件包(x86) - {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • Visual C ++ 2010 SP1可再发行组件包(x64) - {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • Visual C ++ 2010 SP1可再发行组件包(ia64) - {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}

答案 1 :(得分:8)

您可以采用建议的方法来安装directx:始终运行可再发行组件。由于它是必需的,并且你已经发货了,即使它已经安装也没有任何损害。

答案 2 :(得分:6)

看起来像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*

答案 3 :(得分:3)

我特意开源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项目,所以请随意在自己的应用程序中使用它。