【问题标题】:How to detect whether I need to install VCRedist?如何检测我是否需要安装 VCRedist?
【发布时间】:2009-04-08 16:58:21
【问题描述】:

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

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

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

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

我不敢相信微软没有为这种情况提供任何东西,但是搜索互联网已经太久了现在让我回到好的 ol' SO :)

【问题讨论】:

    标签: visual-c++ installation redistributable


    【解决方案1】:

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

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

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

    Visual C++ 2010 可再发行包 (x86)

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86] 已安装 = 1 (REG_DWORD)

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

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64] 已安装 = 1 (REG_DWORD)

    Visual C++ 2010 可再发行包 (ia64)

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64] 已安装 = 1 (REG_DWORD)

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

    如果您喜欢旧版本,这里是 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}

    【讨论】:

    • 谢谢!,这部分对我很有帮助... 注意:您需要在 64 位操作系统上的 Wow6432Node 下进行检查。 (HKLM\Software\Wow6432Node\Microsoft....)
    【解决方案2】:

    您可以采用推荐的方法来安装 directx:始终运行可再发行组件。由于它是必需的并且您已经发布了它,因此即使它已经安装,运行它也没有什么坏处。

    【讨论】:

    • 现在接受了。这就是我现在正在做的事情。另一个导致 W2K8 上出现问题(在两种检测情况之一中)。
    • 如果您这样做,请务必接受并忽略错误代码 5100(“已安装较新版本”)。我们最近在 PostgreSQL 安装程序中遇到了一些麻烦。
    • 总是运行 redist 需要很多时间。
    • 始终运行安装程序会导致repair 选项在它已经安装并显示 UI 时启动。这似乎导致需要重新启动。
    • 原始问题没有提到directx,也许有人应该更新标题并重新标记问题,这样我们就不会被重定向到阅读对我们没有任何价值的东西。
    【解决方案3】:

    看起来微软开发人员提出了another solution,使用MsiQueryProductState API,可惜也依赖于GUID。

    更新:代码昨天上线,似乎运行良好。以下是正在做的事情:检查我知道的最新 GUID 和安装路径²。如果两者都失败,则安装它。这似乎工作正常。

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

    FWIW,Microsoft Visual C++ 2008 / VC90 SP1 可再发行组件的 GUID - x86 9.0.30729

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

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

    【讨论】:

      【解决方案4】:

      我专门开源了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 运行时(并检查其内容。)

      以下是使用它的实际示例:

       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 项目,因此请随意在您自己的应用程序中使用它。

      【讨论】: