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

Visual c++ 如何检测是否需要安装VCRedist?,visual-c++,installation,redistributable,Visual C++,Installation,Redistributable,我有一个非常类似的问题,但答案不适合我 我维护设置的软件依赖于VC++2008(确切地说是SP1),因此,如果尚未安装,我需要找到安装VCRedist的解决方案。 我知道正确的方法是用合并模块构建msi,但这不是我的事 我所指的重复问题(被接受的问题)的答案对我来说并不适用,因为每个微小的版本(例如9.0.30729.01 vs 9.0.30729.17)都有合适的GUID,我无法猜测或预测未来的版本。此外,我认为这不会检测到Visual Studio,因此不必要地安装VCRedist包,因为它

我有一个非常类似的问题,但答案不适合我

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

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

现在,另一个答案是我应该像查看Microsoft.VC80.CRT一样查看WinSxs文件夹,但这(还)不能帮助我暗示SP1,或者我现在缺少什么?是否有一个表,其中有内部和“外部”版本号,所以我可以暗示某个次要版本号


我不敢相信微软没有为这种情况提供任何帮助,但是搜索互联网已经太长时间了,现在我又回到了好的方面:)

您可以采用推荐的方法安装directx:始终运行可再发行的。因为它是必需的,而且您已经在运送它,所以即使它已经安装好,运行它也没有什么害处。

看起来是由一位Microsoft开发人员提出的,使用的,唉,也依赖于GUID

更新:该代码昨天上线,似乎运行良好。下面是所做的:检查最新的已知GUID和安装路径。如果两者都失败,则安装它。这似乎很有效

此外,它还安装了命令行参数“/qb”,意思是“无人参与但不可见”。看看那些女人

FWW,微软Visual C++ 2008/VC90SP1可重分配的GUID -x86

  • 64位30729.17:8220EEFE-38CD-377E-8595-13398D740ACE
  • 32位30729.17:9A25302D-30C0-39D9-BD6F-21E6EC160475
  • 32位30729.01:6AFCA4E1-9B78-3640-8F72-A7BF33448200
²路径:
<代码> Widir \Wixxs\x86MySoop.VC90.CRTY1FC8B3B9A1E18E3B37.0.30729 *<代码> < /P> < P> Visual Studio C++ 2010,./P> <> P>不同于Visual C++ 2005和2008可重分发包,有注册表项可用于检测Visual C++ 2010可再分发包的存在。 VisualC++ 2010可重分发包检测注册表值

Visual C++ 2010可重分发包(x86)< /p> [HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86] 已安装=1(REG_DWORD)

Visual C++ 2010可重分发包(X64)

[HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64] 已安装=1(REG_DWORD)

Visual C++ 2010可重分发包(IA64)< /P> [HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64] 已安装=1(REG_DWORD)

注意:您需要在64位操作系统上的WOW6432节点下进行检查。(HKLM\Software\Wow6432Node\Microsoft….)

如果您喜欢旧版本,以下是guid

Visual C++ 2010可重分配包装产品代码

  • Visual C++ 2010可再分发包(x86)-{196BB40-15783D01-B29BEFC9A11A1E1}
  • Visual C++ 2010可再分发包(X64)-{DA5E37 1C-633 3-3D8A 93A4-6FD5B20BC66E}
  • Visual C++ 2010可再分发包(IA64)-{C1A351664301-38 E9BA67028 23 AD72A1B}

Visual C++ 2010 SP1可重分发软件包产品代码

  • Visual C++ 2010 SP1可重分发包(x86)-{F0C3E5D1-1DE-321E-81676EF0DE69A5}
  • Visual C++ 2010 SP1可重分发包(X64)-{1D8E691-B0D5-35EC-841-616F567A0F7}
  • Visual C++ 2010 SP1可再分发包(IA64)-{8C73C1C-2DE5-3B01-AFB8B46EF4AB41CD}
我专门开源,并在Apache 2.0许可证下提供

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

  • 检查MsiQueryProductState API
  • 检查WinSxS文件夹的内容是否与产品目录匹配;及
  • 检查当前工作目录中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;
    

    wcout现在接受了这一点。这就是我现在正在做的。另一个会导致W2K8出现问题(在两种检测情况中的一种情况下)。如果这样做,请确保接受并忽略错误代码5100(“已安装较新版本”)。我们最近在PostgreSQL安装程序中遇到了一些问题。始终运行redist需要很多时间。始终运行安装程序会导致
    repair
    选项在已经安装并且显示UI的情况下启动。这似乎导致需要重新启动。原始问题没有提到directx,也许有人应该更新标题并重新标记问题,这样我们就不会被重定向到阅读对我们没有任何价值的内容。谢谢!,这部分真的帮助了我。。。注意:您需要在64位操作系统上的WOW6432节点下进行检查。(HKLM\Software\Wow6432Node\Microsoft….)