Как обнаружить распространяемый файл VC++ 2008?

StackOverflow https://stackoverflow.com/questions/203195

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

ВК++2008 (SP1):HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}

или

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

Другие советы

Я не думаю, что какое-либо из этих решений может помочь, если вы используете другую ОС!Например, 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 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}

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

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

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

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

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

* 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 с пакетом обновления 1 (SP1) Обновление безопасности 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/downloads/details.aspx?familyid=AE2E1A40-7B45-4FE9-A20F-2ED2923ACA62

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

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

Loadlibrary выполнит поиск путей за вас.

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

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

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

FWIW, GUID для распространяемого пакета Microsoft Visual C++ 2008/VC90 SP1 — 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

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

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

Я открыл исходный код проект Visual C++ на Github, который проверяет наличие распространяемых DLL VC++. в частности, и сделал его доступным под лицензией Apache 2.0.

Он имеет три различных метода проверки доступности сред выполнения VC++9 и VC++10:

  1. Проверяет API MsiQueryProductState;
  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;

я лицензировал ЭЛТ-детектор проект под Apache 2.0, поэтому не стесняйтесь использовать его в своих приложениях.

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

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

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

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

Код продукта для «Обновление безопасности распространяемого пакета MFC Microsoft Visual C++ 2008 с пакетом обновления 1 (x86)»: {9BE518E6-ECC6-35A9-88E4-87755C07200F}

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

Я хотел бы расширить список GUID следующими значениями:

32бит 30729.17
{9A25302D-30C0-39D9-BD6F-21E6EC160475}
32бит 30729.01
{6AFCA4E1-9B78-3640-8F72-A7BF33448200}
64бит 30729.17
{8220EEFE-38CD-377E-8595-13398D740ACE}
64бит 30729.01
{0DF3AE91-E533-3960-8516-B23737F8B7A2}
ВК++2008 (сп1)
{3C3D696B-0DB7-3C6D-A356-3DB8CE541918}
ВК++2008 (оригинал)
{FF66E9F6-83E7-3A3E-AF14-8DE9A809A6A4}
ИА64 30729.01
{22E23C71-C27A-3F30-8849-BB6129E50679}
32бит 30729.4148
{7B33F480-496D-334A-BAC2-205DEC0CBC2D}
Visual Studio 2008 Профессиональный пакет обновления 1 (SP1)
{D7DAD1E4-45F4-3B2B-899A-EA728167EC4F}
32бит 30729.01
{F333A33D-125C-32A2-8DCE-5C5D14231E27}

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

Самый верный способ – использовать Мсикуерипродуктстате API с GUID разных версий vcredist.

Оно работает!

С уважением.

Найдена запись реестра для распространяемого компонента 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