Обнаружение установки распространяемого Visual C++ для Visual Studio 2012

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

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

18 ответов


это зависит от того, какую версию вы используете. Эти два ключа 2012 года хорошо работали для меня с соответствующими версиями для загрузки для обновления 4. Обратите внимание, что некоторые из этих местоположений reg могут зависеть от ОС. Я собрал эту информацию из Windows 10 для 64-разрядных'ы, "...двоичные файлы, которые поставляются с 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, я собираюсь использовать список ключей, который заканчивается идентификатор 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 за выводы Вай Ха Ли
Август 24th, 2018 -- Обновленная версия 2017 для 14.15.26706, обновленные зависимости Visual C++, упакованные с VS 2017 15.8.1
Май 16th, 2018 -- Обновленная версия 2017 для 14.14.26405.0 как новая запись c++ 2017
Сентябрь 8th, 2017 -- обновленная версия 2017 для 14.11.25325.0 как новая запись Visual C++ 2017
Апрель 7th, 2017 -- обновленная версия 2017 14.10.25008.0 как новая запись Visual C++ 2017
Октябрь 24th, 2016 -- обновленная информация о версии 2015 для 14.0.24215.1
Август 18th, 2016 -- обновленная информация о версии 2015 для 14.0.24212
27-го мая 2016 г.-обновлена информация для обновления MSVC2015 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, которые могут привести к тому, что, хотя время выполнения VC10 было установлено, их номер сборки был недостаточно недавним, поэтому ваш 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 to использовать 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\SOFTWARE\Microsoft\DevDiv\vc\обслуживание\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 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

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