我的问题与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,或者此时我还缺少什么?是否有一个带有内部和“外部”版本号的表格,所以我可以暗示某个次要版本号?
我无法相信微软没有为这种情况提供任何东西,但是现在搜索互联网的时间已经太长了,现在让我回到了好的地方:')
答案 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 SP1可再发行软件包产品代码
答案 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
²路径:
$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运行时的可用性:
以下是实际使用它的示例:
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项目,所以请随意在自己的应用程序中使用它。