Как определить, нужно ли устанавливать VCRedist?

У меня есть вопрос, очень похожий на этот но ответ не работает для меня.

программное обеспечение, для которого я поддерживаю настройку, зависит от VC++ 2008 (SP1, точно), поэтому мне нужно найти решение для установки VCRedist, если он еще не установлен. Я понимаю, что правильным способом было бы построить msi с модулями слияния, но это не на моих руках.

ответ на дублирующий вопрос, на который я ссылаюсь (принятый), не работает для меня, потому что каждый крошечный выпуск (например, 9.0.30729.01 vs 9.0.30729.17) имеет правильные GUID, которые я не могу угадать или предсказать для будущих версий. Кроме того, я считаю, что это не обнаружит Visual Studios и, следовательно, излишне устанавливать пакет VCRedist, когда он уже находится на машине разработчиков. Я не хочу никого беспокоить этим, конечно, не тот, у кого уже установлена DevStudio.

теперь другой ответ говорит, что я должен посмотреть в папке WinSxs, как $WINDIRWinSxSx86_Microsoft.VC80.CRT_ но это вовсе не (пока) помогите мне подразумевать SP1, или есть что-то, чего мне не хватает на данный момент ? Есть ли где-то таблица с внутренними и "внешними" номерами версий, поэтому я мог бы подразумевать определенный номер младшей версии ?

Я не могу поверить, что Microsoft ничего не предоставляет для этого сценария, но поиск в паутине уже слишком долго теперь возвращает меня к хорошему ol ' SO:)

4 ответов


вы можете использовать рекомендуемый подход для установки directx: всегда запускайте распространяемый компонент. Поскольку это необходимо, и вы уже отправляете его, нет никакого вреда в его запуске, даже если он уже установлен.


Для Visual Studio C++ 2010,все стало немного легче.

В отличие от распространяемых пакетов Visual C++ 2005 и 2008, существуют разделы реестра, которые можно использовать для обнаружения наличия распространяемого пакета Visual C++ 2010.

Visual C++ 2010 распространяемые значения реестра обнаружения пакетов

распространяемый пакет Visual C++ 2010 (x86)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86] Установлен = 1 (REG_DWORD) в

распространяемый пакет Visual C++ 2010 (x64)

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64] Установлен = 1 (REG_DWORD) в

распространяемый пакет Visual C++ 2010 (ia64)

[раздел HKEY_LOCAL_MACHINE\программное обеспечение\Microsoft\VisualStudio\10.0\ВК\vcredist с\ia64 не] Установлен = 1 (Типа REG_DWORD)

Примечание: вам нужно будет проверить под Wow6432Node на 64-разрядной ОС. (HKLM\Software\Wow6432Node\Microsoft....)

Если вам нравится более старая версия, вот GUIDs

Visual C++ 2010 распространяемый пакет коды продуктов

  • распространяемый пакет Visual C++ 2010 (x86)-{196BB40D-1578-3D01-B289-BEFC77A11A1E}
  • распространяемый пакет Visual C++ 2010 (x64) - {DA5E371C-6333-3D8A-93A4-6FD5B20BCC6E}
  • распространяемый пакет Visual C++ 2010 (ia64)-{C1A35166-4301-38E9-BA67-02823AD72A1B}

Visual C++ 2010 SP1 распространяемый пакет коды продуктов

  • распространяемый пакет Visual C++ 2010 SP1 (x86)-{F0C3E5D1-1ADE-321E-8167-68EF0DE699A5}
  • распространяемый пакет Visual C++ 2010 SP1 (x64)-{1D8E6291-B0D5-35EC-8441-6616F567A0F7}
  • Visual C++ 2010 SP1 Распространяемый пакет (ia64)-{88C73C1C-2DE5-3B01-AFB8-B46EF4AB41CD}

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

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

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

Fwiw, GUID для распространяемого Microsoft Visual C++ 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

2 путь: $WINDIR\WinSxS\x86_Microsoft.VC90.CRT_1fc8b3b9a1e18e3b_9.0.30729*


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