Определить, установлен ли распространяемый Visual C++ для Visual Studio 2012
Как определить, установлен ли распространяемый Visual C++ для Visual Studio 2012?
Я попробовал Google, и никто не задал этот вопрос, сюрприз!
18 ответов:
это зависит от того, какую версию вы используете. Эти два ключа 2012 года хорошо работали для меня с их соответствующими версиями для загрузки для обновления 4. Обратите внимание, что некоторые из этих мест reg могут зависеть от ОС. Я собрал эту информацию из Windows 10 x64'ы, "...двоичные файлы, которые поставляются с VC++ 2012 update 4 (
11.0.61030.0
) есть версия11.0.60610.1
для двоичных файлов ATL и MFC, и11.0.51106.1
для всего остального, например msvcp110.dll и msvcr110.dll..."
Visual C++ 2013
Microsoft Visual C++ 2013 Redistributable (x64) Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{050d4fc8-5d48-4b8f-8972-47c82c46020f} Configuration: x64 Version: 12.0.30501.0
прямая загрузка URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe
Microsoft Visual C++ 2013 Redistributable (x86) Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{f65db027-aff3-4070-886a-0d87064aabb1} Configuration: x86 Version: 12.0.30501.0
прямая загрузка URL: https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe
Visual C++ 2015
Microsoft Visual C++ 2015 Redistributable (x64) - 14.0.24215 Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{d992c12e-cab2-426f-bde3-fb8c53950b0d} Configuration: x64 Version: 14.0.24215.1
прямая загрузка URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x64.exe
Microsoft Visual C++ 2015 Redistributable (x86) - 14.0.24215 Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{e2803110-78b3-4664-a479-3611a381656a} Configuration: x86 Version: 14.0.24215.1
прямая загрузка URL: https://download.microsoft.com/download/6/A/A/6AA4EDFF-645B-48C5-81CC-ED5963AEAD48/vc_redist.x86.exe
Visual C++ 2017
будьте осторожны: либо используется новая конвенция о реестре 2017 года, либо она еще не завершена. Как я предполагаю, самые верхние ключи:
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle]
и[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle]
могут быть изменены или, по крайней мере, имеют разные вложенные GUID, я собираюсь использовать список ключей, которые заканчиваются на a идентификатор GUID.
Microsoft Visual C++ 2017 Redistributable (x64) - 14.15.26706 Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{95ac1cfa-f4fb-4d1b-8912-7f9d5fbb140d}] Configuration: x64 Version: 14.15.26706.0
прямая загрузка URL: https://download.visualstudio.microsoft.com/download/pr/20ef12bb-5283-41d7-90f7-eb3bb7355de7/8b58fd89f948b2430811db3da92299a6/vc_redist.x64.exe
Microsoft Visual C++ 2017 Redistributable (x86) - 14.15.26706 Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{7e9fae12-5bbf-47fb-b944-09c49e75c061}] Configuration: x86 Version: 14.15.26706.0
прямая загрузка URL: https://download.visualstudio.microsoft.com/download/pr/749aa419-f9e4-4578-a417-a43786af205e/d59197078cc425377be301faba7dd87a/vc_redist.x86.exe
список изменений:
Сентябрь 12th, 2018 -- добавлена версия предостережение к обновлению 2012 4 per Wai Ha Lee's findings
24 августа 2018 г. -- обновлена версия 2017 для 14.15.26706, обновленные зависимости Visual C++ в комплекте с VS 2017 15.8.1
16 мая 2018 года -- обновлена версия 2017 для 14.14.26405.0 в качестве новой записи C++ 2017
8 сентября 2017 г. -- обновлена версия 2017 для 14.11.25325.0 в качестве новой записи Visual C++ 2017
7 апреля 2017 года -- обновлена версия 2017 года 14.10.25008.0 как новая запись Visual C++ 2017
24 октября 2016 года -- обновлена информация о версии 2015 года для 14.0.24215.1
18 августа 2016 -- обновлена информация о версии 2015 для 14.0.24212
27 мая 2016 г. -- обновлена информация для MSVC2015 Update 2пожалуйста, свяжитесь со мной здесь, если любой из них устарели.
попробовать
HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing.0
в качестве отправной точки. Я буду использовать это в качестве проверки для установки среды выполнения VC++ 11 (VS 2012).
вы можете проверить
Installed
значение1
в этом разделе реестра:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio.0\VC\Runtimes\x86
на 64-битных системах. В коде, который приведет к доступу к разделу реестраHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes\x86
. Обратите внимание на отсутствиеWow6432Node
.в 32-разрядной системе Реестр такой же без
Wow6432Node
:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes\x86
в манифесте пакета загрузчика, поставляемом с Visual C++, нет элемента installcheck. Думаю, Microsoft хочет всегда устанавливать, если вы установите его в качестве предварительного условия.
конечно, вы все еще можете вызвать MsiQueryProductState, чтобы проверить, установлен ли пакет VC redist через MSI, код пакета можно найти, запустив
wmic product get
в командной строке, или если вы уже находитесь в wmic:root\cli, запустите
product where "Caption like '%C++ 2012%'"
ответ на этот простой вопрос, к сожалению, не простой, но работает в 100% всех систем, и даже расширяется до многочисленных .NET-фреймворков.
сложность возникает из-за того, что есть (и были) много версий VC runtimes, которые могут привести к тому, что, хотя VC10 runtimes были установлены, их номер сборки не был достаточно недавним, поэтому ваш EXE не запустится, если вы не установили очень точные времени выполнения, которые вам нужны, или один из новые среды выполнения, которые позволяют эту и предыдущие версии для одной и той же основной версии работать с ним (бок о бок ад). Кроме того, если у вас есть 64-разрядный EXE, вам придется проверить как 32, так и 64-разрядные среды выполнения.
тем не менее, единственный надежный способ определить, установлены ли среды выполнения для вашего EXE это попытка запустить EXE - или другой EXE, который построен с теми же настройками, что и ваш основной EXE и чья единственная цель - ничего не делать. Просто запустите (что означает, что время выполнения установлено) или не запускается (если не установлено).
Я сделал следующее для установщика, который требовал установки 32-и 64-разрядных версий VC10: установщик пытается запустить все фиктивные EXEs, и если это удастся, соответствующая среда выполнения считается установленной. Это также решает 32/64-разрядный сценарий.
Это, кстати, также работает, чтобы определить, установлена ли правильная платформа .net framework, что очень сложно в Windows 8 и 10, поскольку загружаемая встроенная поддержка .net 3.5 также поддерживает версии .net 3.0 и 2.0 - для них нет записей реестра. (И что еще хуже, вы даже не можете использовать стандартные установщики фреймворков здесь, вы должны используйте встроенную поддержку и загрузите ее через Windows или перестройте свое приложение с помощью .net 4, но это уже другая история).
C++ dummy EXE может быть построен с помощью проекта со следующим кодом (и еще один в 64-битной конфигурации, если необходимо):
int _tmain(int argc, _TCHAR* argv[]) { return 0; }
не забудьте установить свойства проекта использовать MFC до использовать MFC в общей DLL. Исполняемые файлы будут иметь размер около 4 КБ-небольшая цена, чтобы заплатить за уверенный результат.
чтобы дать пользователям хороший опыт установки, вы можете сделать следующее (пример кода для NSIS):
Function TryLaunchApplication Pop ; pathname nsExec::Exec Pop ${If} == "error" ${OrIf} != 0 Push 0 ${Else} Push 1 ${EndIf} FunctionEnd
и вызвать его в функцию, например CheckRuntimes
Function CheckRuntimes ; Try to execute VC++ 10 application (32 bit) Push "Vc10RuntimeCheckerApp.exe" Call TryLaunchApplication Pop $Vc10RuntimesFound ; Add 64 bit check if required. ; Remember to try running the 64 bit EXE only on a 64 bit OS, ; which requires further checks. ; Try to execute .net application Push "DotNetRuntimeCheckerApp.exe" Call TryLaunchApplication Pop $DotNetFrameworkFound FunctionEnd
затем запустите проверку времени выполнения, например, при выходе из Добро пожаловать страница и кэшировать результат, так что вам не придется перепроверять каждый раз, когда пользователь нажимает на кнопку "Назад" и "далее".
затем сделайте раздел только для чтения в дереве установки и предварительно выберите или снимите его с функции a, которая выполняется перед компоненты отображается страница.
Это позволит убедиться, что установка каждого отсутствующего компонента среды выполнения является обязательной и пропускается, если он уже присутствует.
поскольку Visual Studio 2010 и более поздние версии перестали использовать WinSxS, может быть достаточно просто проверить %windir%\system32\msvcr110.файл DLL. Если вы хотите убедиться, что у вас есть достаточно новая версия, вы можете проверить, является ли версия файла 11.0.50727.1 (VS2012 RTM) или 11.0.51106.1 (VS2012 Update 1).
для меня это место работал: Раздел HKEY_LOCAL_MACHINE\программное обеспечение\Майкрософт\DevDiv\ВК\обслуживание\11.0\\RuntimeMinimum версия
проверьте, какая версия у вас есть после установки пакета и использовать это в качестве условия в установщике. (мина устанавливается так, чтобы 11.0.50727 после установки VCred).
просто перейдите в Панель управления > Программы и компоненты, и все они отображаются там.
Я не эксперт, и этот ответ довольно прост по сравнению с тем, что люди отвечают (проверка реестра), поэтому я не уверен, что это правильный ответ, но он сделал трюк для меня.
if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\VCRedist\x86","Installed") = 0 Then if RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes\x86","Installed") = 0 Then
мне удалось сделать это с InnoSetup.
Я проверил наличие ключа реестра:
HKLM\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes
если он удален, он не существует. Если он установлен, он существует.
кстати, это также может быть в Wow6432Node:
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio.0\VC\Runtimes
проверка состояния установки для продукта через MsiQueryProductState в значительной степени эквивалентно проверке реестра напрямую, но вам все равно нужен GUID для ProductCode.
как уже упоминалось, одним недостатком этих подходов является то, что каждое обновление имеет свой код продукта!
К счастью, MSI предоставляет UpgradeCode который определяет "семью" продуктов. Вы можете использовать Orca, чтобы открыть один из MSIs для извлечения этой информации. Например, UpgradeCode для распространяемого VS2015 является
{65E5BD06-6392-3027-8C26-853107D3CF1A}
можно использовать MsiEnumRelatedProducts чтобы получить все идентификаторы продукта для этого UpgradeCode. На практике, поскольку каждое обновление redist заменяет предыдущее, это даст только один код продукта-например,
{B5FC62F5-A367-37A5-9FD2-A6E137C0096F}
для обновления VS2015 2 x86.независимо от того, вы можете проверить версию через MsiGetProductInfo(productCode, INSTALLPROPERTY_VERSIONSTRING, ...) или аналогичные функции для сравнения с версией, которую вы хотите, например, чтобы проверить эквивалентную или более позднюю версию.
обратите внимание, что в приложении C++ вы также можете использовать
_VC_CRT_MAJOR_VERSION
,_VC_CRT_MINOR_VERSION
,_VC_CRT_BUILD_VERSION
если вы#include <crtversion.h>
-- таким образом, вы можете определить вычислить версию CRT, с которой был построен ваш двоичный файл.
этот код PowerShell должен сделать трюк
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table –AutoSize
Мне нужно было то же самое, и хотя AFAIK это не может быть сделано программно, это сработало для меня.
Я просто пошел, чтобы начать -- > удалить программу, и прокрутил вниз, пока я не нашел распространяемый VC++, который включает в себя номер версии. Погуглив номер версии, сказал мне, что он принадлежит VS2012 SP1.
старый вопрос, но вот подход, который мы использовали с тех пор Visual Studio 2005 с успехом. Я только что протестировал его с помощью Visual Studio 2012 Update 4 (так как мы, наконец, обновляем наше программное обеспечение с 2010 по 2012 год).
поскольку распространяемые пакеты Visual C++ регистрируют свой деинсталлятор в windows (поэтому он отображается в списке "программы и компоненты" панели управления), мы просто проверяем отображаемое имя ключа деинсталлятора в окне регистратура.
вот соответствующий код NSIS:
ReadRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\" "DisplayName" StrCmp "Microsoft Visual C++ 2012 Redistributable (x86) - 11.0.61030" vs2012redistInstalled DetailPrint "Microsoft Visual C++ 2012 Update 4 Redistributable not found!" DetailPrint "Downloading from www.mywebsite.com" ; insert applicable download code here ExecWait '"<downloaded redist exe>" /promptrestart /passive' vs2012redistInstalled:
обратите внимание, что поскольку наш установщик является 32-битным exe, windows обрабатывает определение, действительно ли раздел реестра находится в виртуализированном Wow6432Node вместо указанного выше местоположения, поэтому приведенный выше код работает как на 64-битных, так и на 32-битных установках windows без необходимости явно проверять оба ключа.
Также обратите внимание, что для обновления приведенного выше кода до другой версии VC++ Redist, просто измените идентификатор GUID в путь к разделу реестра и отображаемое имя для всего, что вам нужно.
хотя это может быть не рекомендуемый метод, он работал на 10 000+ машин за последние 10 лет работает каждый вкус windows от XP/XP64 до Windows 10 с использованием redists для 2005, 2010, 2010sp1, а теперь 2012u4.
Я бы проверил
Installed
стоимостью
HKLM\SOFTWARE\[WOW6432Node]\Microsoft\Windows\CurrentVersion\Uninstall\{VCRedist_GUID}
ключ
- где GUID of
VC++ 2012 (x86)
и{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
WOW6432Node
будет присутствовать или нет в зависимости отVC++ redist
продукт
я столкнулся с этим вопросом, ища ответ в контексте проверки распространяемого Visual C++ как части установщика MSI, созданного WiX.
мне не понравилось, как GUID изменяется с версией и операционной системой, поэтому я создал пользовательское действие, написанное на C#, чтобы проверить распространяемый Visual C++.
все, что ниже, специально предназначено для распространяемого Visual C++ 2015 (x64), но его можно легко изменить для любого версия.
using Microsoft.Deployment.WindowsInstaller; using Microsoft.Win32; namespace CustomActions { public class DependencyChecks { [CustomAction] public static ActionResult IsVC2015RedistInstalled(Session session) { session.Log("Begin Visual C++ 2015 Redistributable installation check."); var dependenciesKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Classes\Installer\Dependencies"); foreach(var subKey in dependenciesKey.GetSubKeyNames()) { var dependency = dependenciesKey.OpenSubKey(subKey); var displayName = (string)dependency.GetValue("DisplayName"); if(displayName != null) { if (displayName.Contains("Microsoft Visual C++ 2015 Redistributable (x64)")) { session.Log("Visual C++ 2015 Redistributable is installed."); return ActionResult.Success; } } } session.Log("Visual C++ 2015 Redistributable is not installed."); session.Message(InstallMessage.Error, new Record(1, "This application requires Visual C++ 2015 Redistributable. Please install, then run this installer again. https://www.microsoft.com/en-us/download/details.aspx?id=53587")); return ActionResult.Failure; } } }
затем в файле wxs
<Binary Id='VC2015RedistCheck' SourceFile='!(wix.ResourcesDir=resources)\CustomActions.CA.dll'/> <CustomAction Id='VC2015RedistCheckAction' Execute='immediate' BinaryKey='VC2015RedistCheck' DllEntry="IsVC2015RedistInstalled" Return='check'/> <InstallExecuteSequence> <Custom Action='VC2015RedistCheckAction' After='InstallInitialize'/> </InstallExecuteSequence>
то, что большинство людей пропускают, является обязательным
/reg:32
для проверки ключа на Windows x64.посмотреть статья справки Microsoft на эту тему.
вот сценарий, который демонстрирует, как правильно проверить наличие распространяемого Visual C++ для Visual Studio 2012 Update 4.
@ECHO OFF :Author REM "CREATED BY WAR59312" REM "FEB 7th 2017" REM Clear Screen CLS TITLE Detect Visual C++ 2012 Redistributables REM This Batch Script Detects If Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed :DetectWindowsOS REM Are We Running On x86 Or x64 IF NOT DEFINED PROCESSOR_ARCHITEW6432 ( IF %PROCESSOR_ARCHITECTURE% EQU x86 ( REM Windows Is x86 GoTo Check32Bit ) ELSE ( REM Windows Is x64 SET NeededFor64BitOnly=/reg:32 GoTo Check64Bit )) ELSE ( REM Windows Is Unknown But Assume x64 To Be Safe SET NeededFor64BitOnly=/reg:32 GoTo Check64Bit ) :Check64Bit REM Checks If Visual C++ 64Bit Redistributable for Visual Studio 2012 Update 4 Is Installed REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes\x64" /v "Version" %NeededFor64BitOnly% 2>NUL^ | ( FIND "v11.0.61030.00" >NUL ) && ( ECHO. ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed ECHO. GoTo Check32Bit ) || ( ECHO. ECHO 64bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed ECHO. GoTo Check32Bit ) :Check32Bit REM Checks If Visual C++ 32Bit Redistributable for Visual Studio 2012 Update 4 Is Installed REG QUERY "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio.0\VC\Runtimes\x86" /v "Version" %NeededFor64BitOnly% 2>NUL^ | ( FIND "v11.0.61030.00" >NUL ) && ( ECHO. ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is Installed ) || ( ECHO. ECHO 32bit Visual C++ Redistributable for Visual Studio 2012 Update 4 Is NOT Installed ) :END ECHO. PAUSE EXIT
вы можете искать в реестре.На самом деле у меня нет vs2012, но у меня есть vs2010.
есть 3 разных (но очень похожих) ключи реестра для каждого из 3 пакетов платформы. Каждый ключ имеет значение DWORD под названием "установлен" со значением 1.
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x86
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\x64
HKLM\SOFTWARE\Microsoft\VisualStudio\10.0\VC\VCRedist\ia64
вы можете использовать функцию реестра для этого......