Как обнаружить распространяемый VC ++ 2008? - PullRequest
31 голосов
/ 15 октября 2008

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

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

Ответы [ 13 ]

19 голосов
/ 21 мая 2010

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

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

Файлы среды выполнения обновления безопасности 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}
16 голосов
/ 18 марта 2009

Проверка реестра:

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

или

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

6 голосов
/ 01 октября 2011

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

Обновление безопасности MFC для распространяемого пакета Visual C ++ 2005 с пакетом обновления 1 (SP1)

* 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

5 голосов
/ 15 октября 2008

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

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

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

4 голосов
/ 09 апреля 2009

похоже, что другое решение , предложенное Microsoft-Developer с использованием 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*

2 голосов
/ 14 ноября 2013

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

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

  1. Проверяет API MsiQueryProductState;
  2. Проверьте содержимое папки WinSxS на наличие соответствующих каталогов продуктов; и
  3. Проверяет текущий рабочий каталог на наличие локальных версий сред выполнения VC ++ 9 и VC ++ 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-Detector под Apache 2.0, поэтому не стесняйтесь использовать его в своих собственных приложениях.

2 голосов
/ 15 октября 2008

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

1 голос
/ 21 октября 2011

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

1 голос
/ 11 сентября 2009

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

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

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

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

0 голосов
/ 25 августа 2011

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

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

Привет.

...