Определить, установлен ли распространяемый Visual C++ для Visual Studio 2012


Как определить, установлен ли распространяемый Visual C++ для Visual Studio 2012?

Я попробовал Google, и никто не задал этот вопрос, сюрприз!

18 92

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).

просто перейдите в Панель управления > Программы и компоненты, и все они отображаются там.

Я не эксперт, и этот ответ довольно прост по сравнению с тем, что люди отвечают (проверка реестра), поэтому я не уверен, что это правильный ответ, но он сделал трюк для меня.

Programs and Features

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

вы можете использовать функцию реестра для этого......