2009-04-08 52 views
20

我有一个和this one非常相似的问题,但答案不适用于我。如何检测我是否需要安装VCRedist?

软件我维护的设置取决于VC++ 2008(SP1,正好),因此我需要找到一个解决方案来安装VCRedist,如果还没有安装。 我知道正确的方法是用合并模块构建msi,但它不在我的手中。

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

现在又有一个答案说我应该在WinSxs文件夹中看起来像$WINDIR\WinSxS\x86_Microsoft.VC80.CRT_,但是这还没有帮助我暗示SP1,或者在这一点上我有什么缺失?有没有一个表的内部和“外部”版本号,所以我可以暗示某个小版本号?

我不相信有微软为这种情况提供了什么,但寻找已经太久了,现在的interwebs让我回到了良好醇” SO :)

回答

8

你可以采取推荐的方式安装directx:始终运行可再发行组件。由于它是必需的,而且您已经在运送它,所以即使它已经安装,运行它也没有什么坏处。

+0

现在接受了。这就是我现在正在做的。另一个导致在W2K8上出现问题(在两种检测情况中的一种)。 – lImbus 2009-11-11 19:56:27

+4

如果您这样做,一定要接受并忽略错误代码5100(“已安装更新的版本”)。我们最近在PostgreSQL安装程序中遇到了一些麻烦。 – 2012-06-09 03:33:47

+6

总是运行redist需要很多时间。 – sorin 2013-07-17 22:42:31

6

看起来像是有一个由微软开发人员提出的another solution,使用MsiQueryProductState API,唉同时也依赖于GUID。

更新:代码昨天生效,似乎工作正常。以下是所做的工作:检查最新的已知GUID和路径²到它应该安装的位置。如果两者均失败,则安装。这似乎工作正常。

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

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

13

对于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 \微软\ VisualStudio的\ 10.0 \ VC \ VCRedist \ 86] 安装= 1( REG_DWORD)

的Visual C++ 2010再分发程序包(64)

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

的Visual C++ 2010再分发程序包(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再发行组件包(86) - {196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • 的Visual C++ 2010再分发程序包(64) - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • 的Visual C++ 2010再分发程序包(IA64) - {C1A35166-4301-38E9-BA67-02823AD 72A1B}

的Visual C++ 2010 SP1发行包的产品代码

  • 的Visual C++ 2010 SP1可再发行包(x86) - {F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • 的Visual C++ 2010 SP1再分发程序包(64) - {1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • 的Visual C++ 2010 SP1再分发程序包(IA64) - {88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}
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运行时的当前工作目录(并检查其内容。)

下面是使用的样品,它实际上是这样的:

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; 

我许可的crt-detector项目的Apache 2.0下,可以随意在自己的应用程序来使用它。

相关问题