是否有一个注册表设置,我可以看一下以确定是否可视C++可重新分发安装,无论是单独或作为其一部分的Visual Studio2008年?我知道,我可以启动VC++2008年可再发行的安装和让它处理的检测,但是它看起来更清洁,如果我能检查它并不打扰启动安装程序,如果可再发行已经在该系统。

这没什么大不了的,如果没有设置的搜索,因为这只是用于初步安装,我们已经为新版本的我们的软件。我们不需要它的新窗户安装基于安装,我们的工作上,这将取代旧的技术的人,并将使用合并模块。

有帮助吗?

解决方案

检查注册表:

  

VC ++ 2008(sp1):   HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\ {3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

  

VC ++ 2008(原创):   HKLM \ SOFTWARE \微软\的Windows \ CurrentVersion \卸载\ {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

其他提示

我不认为任何这些溶液可以帮助你使用不同的操作系统!对前,MsiQueryProductState将永远返回-1使用Vista VC8.0

同时-1VC8.0/8的.0SP1/9.0Windows7!所以GUID解决方案,microsoft提供,不工作,在所有情况下

所以我猜我被迫坚持windir%\;方法并搜索

  • x86_Microsoft.VC80.CRT*
  • x86_Microsoft.VC90.CRT*

对于那些正在寻找的所有Guid,这是一个列表,我创建:

视觉C++2005年的运行时的文件

* VC 8.0 (x86) - {A49F249F-0C91-497F-86DF-B2585E8E76B7}
* VC 8.0 (x64) - {6E8E85E8-CE4B-4FF5-91F7-04999C9FAE6A}
* VC 8.0 (ia64) - {03ED71EA-F531-4927-AABD-1C31BCE8E187}

视觉C++2005年SP1运行时的文件

* VC 8.0 SP1 (x86) - {7299052B-02A4-4627-81F2-1818DA5D550D}
* VC 8.0 SP1 (x64) - {071C9B48-7C32-4621-A0AC-3F809523288F}
* VC 8.0 SP1 (ia64) - {0F8FB34E-675E-42ED-850B-29D98C2ECE08}

视觉C++2005年SP1ATL更新安全运行时的文件

* VC 8.0 SP1 ATL Patch (x86) - {837B34E3-7C30-493C-8F6A-2B0F04E2912C}
* VC 8.0 SP1 ATL Patch (x64) - {6CE5BAE9-D3CA-4B99-891A-1DC6C118A5FC}
* VC 8.0 SP1 ATL Patch (ia64) - {85025851-A784-46D8-950D-05CB3CA43A13}

视觉C++2008运行时的文件

* VC 9.0 (x86) - {FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
* VC 9.0 (x64) - {350AA351-21FA-3270-8B7A-835434E766AD}
* VC 9.0 (ia64) - {2B547B43-DB50-3139-9EBE-37D419E0F5FA} 

视觉C++2008年SP1运行时的文件

* VC 9.0 SP1 (x86) - {9A25302D-30C0-39D9-BD6F-21E6EC160475}
* VC 9.0 SP1 (x64) - {8220EEFE-38CD-377E-8595-13398D740ACE}
* VC 9.0 SP1 (ia64) - {5827ECE1-AEB0-328E-B813-6FC68622C1F9}

视觉C++2008年SP1ATL更新安全运行时的文件

* VC 9.0 SP1 ATL (x86) - {1F1C2DFC-2D24-3E06-BCB8-725134ADF989}
* VC 9.0 SP1 ATL (x64) - {4B6C7001-C7D6-3710-913E-5BC23FCE91E6}
* VC 9.0 SP1 ATL (ia64) - {977AD349-C2A8-39DD-9273-285C08987C7B}

VC2005的最新版本:

Visual C ++ 2005 Service Pack 1可再发行软件包MFC安全更新

* VC 8.0 SP1 MFCLOC Patch (x86) - {710F4C1C-CC18-4C49-8CBF-51240C89A1A2}
* VC 8.0 SP1 MFCLOC Patch (x64) - {AD8A2FA1-06E7-4B0D-927D-6E54B3D31028}
* VC 8.0 SP1 MFCLOC Patch (ia64) - {C2F60BDA-462A-4A72-8E4D-CA431A56E9EA}

8.0.50727.6195

http://www.microsoft。 COM /下载/ details.aspx?FAMILYID = AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

又快又脏:

if (LoadLibrary(L"msvcrt80.dll")!=NULL)
{
  // it is installed
}

Loadlibrary将处理为您搜索路径。

看起来像是有 另一个解决方案 提出的一个微软开发、使用 MsiQueryProductState API, 唉也依靠Guid。

更新:代码了昨天,似乎是工作的罚款。这里是什么beeing完成:这是检查最新的知到我GUID和path2来-哪里-这是应该以安装。如果两者的失败,它是安装。这似乎正常工作。

此外,它是安装的命令行参数"/qb",这意味着"人参与但不是隐形"。看看 这种其他的博客 关于这些参数。

总的来说,Guid用微软视C++2008/VC90SP1可再发-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

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

检查 $ WINDIR \ WinSxS \ x86_Microsoft.VC90.CRT _ * ,例如,如果您正在检查Visual Studio 2008可再发行组件。

我开源 Github上的一个Visual C ++项目,用于检查VC ++可再发行的DLL 具体而言,它在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下授权 crt-detector 项目2.0,所以请随意在自己的应用程序中使用它。

对于遇到此问题的其他人

更新

1)如果安装了Visual Studio,则会出现所需的DLL,但“redist package”会出现。不是,所以缺少注册表项。 (即这将给出假阴性)。但是,在这种情况下将redist安装在顶部是无害的。

2)redist的每个主要版本(VS2005 / VS2008,x86 / x64 / IA64和Service Pack的任意组合:SP1,ATL安全更新)具有不同的GUID。如果您希望在x86和x64 PC上部署应用程序,请务必小心。

3)如果您使用LoadLibrary或检查Dll文件,请确保定位正确的版本。如果你寻找“任何” msvcrt80.dll(等)的副本,那么你将无法判断它是否是你的程序所链接的版本。

“Microsoft Visual C ++ 2008 Service Pack 1可再发行组件包MFC安全更新(x86)”的产品代码是{9BE518E6-ECC6-35A9-88E4-87755C07200F}

您可以检查WINDOWS \ WinSxS目录下的文件,以查看已安装的版本。通常可以同时安装许多版本,因此您可能需要检查已安装的特定版本。

我想使用以下值扩展GUID列表:

32bit 30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}点击 32bit 30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}点击 64bit 30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}点击 64bit 30729.01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}点击 VC ++ 2008(sp1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}点击 VC ++ 2008(原创)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}点击 IA64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}点击 32bit 30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}点击 Visual Studio 2008 Professional SP1
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}点击 32bit 30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

因此,请确定是否最好通过GUID检查VCredist的存在。

最可靠的方法是将 MsiQueryProductState API与不同vcredist版本的GUID一起使用。

有效!

问候。

找到VC2008可再发行的注册表项。这是我的解决方案:

BOOL IsVC2008RedistInstalled(LPCTSTR pLogFile)
{
    TCHAR szLogEntry[256];
    memset(szLogEntry, '0', sizeof(szLogEntry));
    HKEY hKey;
    LONG lErr;

    TCHAR csid[256];
    _stprintf( csid, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{9A25302D-30C0-39D9-BD6F-21E6EC160475}"));
    lErr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, csid, 0, KEY_QUERY_VALUE, &hKey);
    if (lErr == ERROR_SUCCESS)
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was installed before.\n"));
    toFile(pLogFile, szLogEntry);
    return TRUE;
    }
    else
    {
    _stprintf(szLogEntry, _T("VC2008 Redistributable was not installed before. %ld\n"), lErr);
    toFile(pLogFile, szLogEntry);
    return FALSE;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top