Подтвердить что ты не робот

Как обнаружить VС++ 2008 распространяемым?

Есть ли параметр реестра, который я могу найти, чтобы определить, установлен ли распространяемый Visual С++, независимо от того, является ли он автономным или как часть Visual Studio 2008? Я знаю, что я могу запустить распространяемый установщик VС++ 2008 и позволить ему обрабатывать обнаружение, но он выглядел бы более чистым, если бы я мог проверить его и не беспокоить запуск установщика, если распространяемое уже находится в системе.

Это не biggie, если нет настроек для поиска, поскольку это только для предварительных установщиков, которые у нас есть для новой версии нашего программного обеспечения. Мы не будем нуждаться в нем для новых установщиков Windows Installer, над которыми мы работаем, которые заменят старые технологические и будут использовать модули слияния.

4b9b3361

Ответ 1

Проверьте реестр:

VС++ 2008 (sp1): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

или

VС++ 2008 (оригинал): HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}

Ответ 2

Я не думаю, что любое из этих решений может помочь, когда вы используете другую ОС! Например, MsiQueryProductState всегда будет возвращать -1 с помощью Vista VC8.0

в то время как -1 для VC8.0/8.0 SP1/9.0 с Windows 7! Таким образом, решение GUID, предоставленное Microsoft, не работает во всех случаях.

поэтому я предполагаю, что я вынужден зависеть от подхода% windir%\winsxs и поиска

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

Для тех, кто ищет все GUID, вот список, который я создал:

Файлы времени выполнения Visual С++ 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}

Файлы времени выполнения Visual С++ 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}

Visual С++ 2005 с пакетом обновления 1 (SP1) Файлы времени выполнения обновления безопасности ATL

* 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}

Среда выполнения Visual С++ 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} 

Файлы времени выполнения Visual С++ 2008 с пакетом обновления 1

* 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}

Visual С++ 2008 с пакетом обновления 1 (SP1). Файлы времени выполнения обновления безопасности ATL

* 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}

Ответ 3

Последний для VC2005:

Распространяемый пакет обновления 1 для пакета обновления 1 (SP1) для Visual С++ 2005

* 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/downloads/details.aspx?familyid=AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

Ответ 4

Быстрая и грязная:

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

Loadlibrary будет обрабатывать пути для вас.

Ответ 5

выглядит как другое решение, предложенное Microsoft-разработчиком, используя API MsiQueryProductState, увы, также полагаясь на идентификаторы GUID.

Обновление: код вышел вчера и, похоже, работает нормально. Вот что делается: он проверен на соответствие GUID с последней версией, а также путь² к-где-это-предполагается, чтобы быть установленным. Если оба отказались, он устанавливается. Кажется, что это нормально.

Кроме того, он устанавливается с аргументами командной строки "/qb", что означает "без присмотра, но не невидимым". См. это другое сообщение в блоге об этих параметрах.

FWIW, GUID для Microsoft Visual С++ 2008/VC90 SP1 Распространяемый - x86 9.0.30729

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

² Путь: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*

Ответ 6

Проверьте $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_*, если, например, вы проверяете распространение распространяемого Visual Studio 2008.

Ответ 7

I open-sourced проект Visual С++ в Github, который специально проверяет распространяемые DLL файлы VС++ и сделал его доступным в соответствии с лицензией Apache 2.0.

Он имеет три разных метода проверки доступности VС++ 9 и VС++ 10:

  • Проверяет API-интерфейсы MsiQueryProductState;
  • Осмотреть содержимое папки WinSxS для соответствия каталогов продуктов; и
  • Проверяет текущий рабочий каталог для любых локальных версий VС++ 9 и VС++ 10 (и проверяет их содержимое.)

edit: Здесь образец того, что его использует, выглядит следующим образом:

 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-detect под Apache 2.0, поэтому не стесняйтесь использовать его в своих приложениях.

Ответ 8

Обновить для всех, кто сталкивается с этой проблемой:

1) Если у вас установлена ​​Visual Studio, будут присутствовать необходимые библиотеки DLL, но "redist package" не указан, поэтому ключей реестра не хватает. (т.е. это даст ложный отрицательный результат). Однако установка переименования сверху в этой ситуации безвредна.

2) Каждый основной выпуск redist (Любая комбинация VS2005/VS2008, x86/x64/IA64 и пакетов обновления: SP1, обновление безопасности ATL) имеет другой GUID. Будьте осторожны, если вы планируете развернуть свое приложение на компьютерах x86 и x64.

3) Если вы используете LoadLibrary или проверяете файлы Dll, убедитесь, что вы нацеливаете правильную версию. Если вы ищете "любую" копию msvcrt80.dll(и т.д.), Вы не сможете определить, была ли она связана с вашей версией.

Ответ 9

Код продукта для "Распространяемый пакет обновления для Microsoft Exchange С++ 2008 с пакетом обновления 1 (SP1)" {@BE518E6-ECC6-35A9-88E4-87755C07200F}

Ответ 10

Вы можете проверить файлы в каталоге WINDOWS\WinSxS, чтобы узнать, какие версии вы установили. Зачастую многие версии могут быть установлены за один раз, поэтому вам может потребоваться проверить определенные версии, которые вы установили.

Ответ 11

Найдено записи реестра для 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;
    }
}

Ответ 12

Я хотел бы расширить список 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}
VС++ 2008 (sp1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
VС++ 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}

Поэтому, пожалуйста, решите, стоит ли проверять наличие VCredist по идентификаторам GUID.

Ответ 13

Самый верный способ - использовать API MsiQueryProductState с GUID разных версий vcredist.

Это работает!

С уважением.