Як визначити, чи встановлено перерозподілюваний Visual C ++ для Visual Studio 2012?
Я спробував Google, і це ніхто не задавав цього питання, здивування!
Як визначити, чи встановлено перерозподілюваний Visual C ++ для Visual Studio 2012?
Я спробував Google, і це ніхто не задавав цього питання, здивування!
Відповіді:
Це залежить від того, яку версію ви використовуєте. Ці два ключі 2012 року добре спрацювали зі своїми відповідними версіями для завантаження оновлення 4. Будь ласка, майте на увазі, що деякі з цих регіонів можуть залежати від ОС. Я зібрав цю інформацію з вікна Windows 10 x64 . Я просто збираюся йти і вивантажувати всі ці переглянуті версії та клавіші reg, які я шукаю, щоб виявити встановлення.
Microsoft Visual C++ 2005 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1af2a8da7e60d0b429d7e6453b3d0182
Configuration: x64
Version: 6.0.2900.2180
URL-адреса прямого завантаження: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x64.EXE
Microsoft Visual C++ 2005 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\c1c4f01781cc94c4c8fb1542c0981a2a
Configuration: x86
Version: 6.0.2900.2180
URL-адреса прямого завантаження: https://download.microsoft.com/download/8/B/4/8B42259F-5D70-43F4-AC2E-4B208FD8D66A/vcredist_x86.EXE
Microsoft Visual C++ 2008 Redistributable - x64 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\67D6ECF5CD5FBA732B8B22BAC8DE1B4D
Configuration: x64
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
URL-адреса прямого завантаження: https://download.microsoft.com/download/2/d/6/2d61c766-107b-409d-8fba-c39e61ca08e8/vcredist_x64.exe
Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.6161 (SP1)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\6E815EB96CCE9A53884E7857C57002F0
Configuration: x86
Version: 9.0.30729.6161 (Actual $Version data in registry: 0x9007809 [DWORD])
URL-адреса прямого завантаження: https://download.microsoft.com/download/d/d/9/dd9a82d0-52ef-40db-8dab-795376989c03/vcredist_x86.exe
Microsoft Visual C++ 2010 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1926E8D15D0BCE53481466615F760A7F
Configuration: x64
Version: 10.0.40219.325
URL-адреса прямого завантаження: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x64.exe
Microsoft Visual C++ 2010 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Products\1D5E3C0FEDA1E123187686FED06E995A
Configuration: x86
Version: 10.0.40219.325
URL-адреса прямого завантаження: https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe
Microsoft Visual C++ 2012 Redistributable (x64)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{ca67548a-5ebe-413a-b50c-4b9ceb6d66c6}
Configuration: x64
Version: 11.0.61030.0
URL-адреса прямого завантаження: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x64.exe
Microsoft Visual C++ 2012 Redistributable (x86)
Registry Key: HKLM\SOFTWARE\Classes\Installer\Dependencies\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}
Configuration: x86
Version: 11.0.61030.0
URL-адреса прямого завантаження: https://download.microsoft.com/download/1/6/B/16B06F60-3B20-4FF2-B699-5E9B7962F9AE/VSU_4/vcredist_x86.exe
Застереження щодо версії : Зависновками Вай Ха Лі Лі , "... бінарні файли, які постачаються з оновленням VC ++ 2012 4 ( 11.0.61030.0
), мають версію 11.0.60610.1
для бінарних файлів ATL та MFC, а також 11.0.51106.1
для всього іншого, наприклад, msvcp110.dll та msvcr110.dll . .. "
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
Розглянемо використання пакету 2015-2019 як альтернативу
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
Розглянемо використання пакету 2015-2019 як альтернативу
Caveat : або використовується нова конвенція реєстру 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.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle\Dependents\{427ada59-85e7-4bc8-b8d5-ebf59db60423}]
Configuration: x64
Version: 14.16.27012.6
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/9fbed7c7-7012-4cc0-a0a3-a541f51981b5/e7eec15278b4473e26d7e32cef53a34c/vc_redist.x64.exe
Microsoft Visual C++ 2017 Redistributable (x86) - 14.16.27012
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle\Dependents\{67f67547-9693-4937-aa13-56e296bd40f6}]
Configuration: x86
Version: 14.16.27012.6
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/d0b808a8-aa78-4250-8e54-49b8c23f7328/9c5e6532055786367ee61aafb3313c95/vc_redist.x86.exe
Caveat : Існує ще одна нова конвенція реєстру, яка використовується для Visual C ++ 2019. Також не здається, що це окремий інсталятор для Visual C ++ 2019, тільки цей інсталятор пакета, який представляє Visual C ++ 2015 по 2019 рік.
14.21.27702
Microsoft Visual C++ 2015-2019 Redistributable (x64) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.21,bundle\Dependents\{f4220b74-9edd-4ded-bc8b-0342c1e164d8}]
Configuration: x64
Version: 14.21.27702
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/9e04d214-5a9d-4515-9960-3d71398d98c3/1e1e62ab57bbb4bf5199e8ce88f040be/vc_redist.x64.exe
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.21.27702
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.21,bundle\Dependents\{49697869-be8e-427d-81a0-c334d1d14950}]
Configuration: x86
Version: 14.21.27702
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/c8edbb87-c7ec-4500-a461-71e8912d25e9/99ba493d660597490cbb8b3211d2cae4/vc_redist.x86.exe
14.22.27821
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.22,bundle\Dependents\{5bfc1380-fd35-4b85-9715-7351535d077e}]
Configuration: x86
Version: 14.22.27821
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/0c1cfec3-e028-4996-8bb7-0c751ba41e32/1abed1573f36075bfdfc538a2af00d37/vc_redist.x86.exe
Microsoft Visual C++ 2015-2019 Redistributable (x86) - 14.22.27821
Registry Key: [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.22,bundle\Dependents\{6361b579-2795-4886-b2a8-53d5239b6452}]
Configuration: x64
Version: 14.22.27821
URL-адреса прямого завантаження: https://download.visualstudio.microsoft.com/download/pr/cc0046d4-e7b4-45a1-bd46-b1c079191224/9c4042a4c2e6d1f661f4c58cf4d129e9/vc_redist.x64.exe
Журнал змін :
19 серпня 2019 р. - Додано нову версію пакету пакетів 2015-2019 рр
. 13 червня 2019 р. - Додано новий розділ для версії пакету 2015-2019 рр. 14.21.27702
Та додано невеликі примітки до розділів 2015 та 2017 років щодо розгляду використання новий пакет як альтернатива.
14 грудня 2018 р. - оновлено MSVC2008 для оновлення пакета оновлень 1 для 9.0.30729.6161
висновків Джима
Волфа 27 листопада 2018 року - оновлена інформація для MSVC2017 проти 14.16
12 вересня 2018 р. - Додано попередження щодо версії до 2012 року. Оновлення 4 за висновками Вай Ха Лі
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 2
Будь ласка, зв'яжіться зі мною тут, якщо будь-яке з них застаріло.
[HKEY_CLASSES_ROOT\Installer\Dependencies\,,x86,14.0,bundle\Dependents\{$GUID}
та[HKEY_CLASSES_ROOT\Installer\Dependencies\,,amd64,14.0,bundle\Dependents\{$GUID}
[HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x86,x86,14.16,bundle] [HKEY_CLASSES_ROOT\Installer\Dependencies\VC,redist.x64,amd64,14.16,bundle]
Спробуйте
HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
як відправна точка. Я буду використовувати це як перевірку на встановлення часу виконання VC ++ 11 (VS 2012).
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\DevDiv\VC\Servicing\11.0\RuntimeMinimum
Ви можете перевірити Installed
значення, яке знаходиться 1
в цьому місці реєстру: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
на 64-бітних системах. У коді, який призвів би до доступу до ключа реєстру HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
. Зауважте відсутність Wow6432Node
.
У 32-бітовій системі реєстр такий же без Wow6432Node
:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes\x86
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\VC
але у мене немає Runtimes
ключа. У мене є ключ у відповіді Дейва HKLM\SOFTWARE\Microsoft\DevDiv\VC\Servicing\11.0
.
В маніфесті пакета завантажувального пакета немає елемента встановлення, який постачається з Visual C ++. Здається, Microsoft хоче завжди встановлювати, якщо ви встановите це як необхідну умову.
Звичайно, ви все ще можете зателефонувати в MsiQueryProductState, щоб перевірити, чи встановлений перехідний пакет VC через MSI, код пакета можна знайти, запустивши
wmic product get
в командному рядку, або якщо ви вже перебуваєте в wmic: root \ cli, run
product where "Caption like '%C++ 2012%'"
На жаль, відповідь на це просте запитання не є простим, але працює у 100% усіх систем і навіть розширюється на численні рамки .net.
Складність пов'язана з тим, що існує (і було) багато змін часу виконання VC, що може призвести до того, що, хоча час виконання VC10 було встановлено, їх кількість збірки була недостатньо недавньою, тому ваш EXE не запустився, якщо ви не встановили самі точний час виконання, який вам потрібен, або один із нових циклів виконання, який дасть змогу цій і попередній версії для тієї ж основної версії працювати з нею (бік бік). Крім того, якщо у вас 64-бітний EXE, вам доведеться перевірити обидва, 32 і 64-бітні тривалості виконання.
Однак, єдиний надійний спосіб визначити, чи встановлено час виконання для EXE - це спроба запустити EXE - або інший EXE, який побудований з тими ж налаштуваннями, що і ваш основний EXE, і єдиною метою якого є робити - нічого. Просто запустіть (що означає, що час виконання встановлено) або не виконати (якщо він не встановлений).
Я зробив наступне для інсталятора, який вимагав встановлення VC10 32 та 64 бітових циклів виконання: Інсталятор намагається запустити всі фіктивні EXE, і якщо це вдалося, відповідний час виконання вважається встановленим. Це також вирішує сценарій 32/64 біт.
Це, до речі, також допомагає визначити, чи встановлено правильний .net-фреймворк, що дуже складно в Windows 8 та 10, оскільки завантажена вбудована підтримка .net 3.5 також підтримує .net версії 3.0 та 2.0 - там для них немає записів реєстру. (І що ще гірше, ви навіть не можете використовувати тут стандартних установників фреймворків. Ви повинні використовувати вбудовану підтримку та завантажувати її через Windows, або перебудовувати додаток із .net 4, але це вже інша історія).
C ++ манекен EXE може бути побудований за допомогою проекту із наступним кодом (та іншим у 64-бітовій конфігурації, якщо необхідно):
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
Не забудьте встановити властивості проекту Використання MFC для використання MFC у спільній DLL . Виконаний файл буде розміром близько 4 КБ - це невелика ціна, яку потрібно платити за впевнений результат.
Щоб надати користувачам хороший досвід встановлення, ви можете зробити наступне (зразок коду для NSIS ):
Function TryLaunchApplication
Pop $1 ; pathname
nsExec::Exec $1
Pop $0
${If} $0 == "error"
${OrIf} $0 != 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
Потім запустіть перевірку часу виконання, наприклад, залишаючи сторінку привітання та кешуйте результат, тому вам не доведеться повторно перевіряти кожен раз, коли користувач натискає кнопку "Назад" та "Далі".
Далі зробіть розділ, доступний лише для читання, у дереві встановлення та попередньо виберіть або зніміть його з вибору функції, що виконується перед відображенням сторінки « Компоненти» .
Це дозволить переконатися, що установка кожного пропущеного компонента виконання є обов'язковою та пропускається, якщо він вже є.
Оскільки Visual Studio 2010 і пізніше перестали використовувати WinSxS, можливо, достатньо лише перевірити наявність% windir% \ system32 \ msvcr110.dll. Якщо ви хочете перевірити, чи є у вас достатньо нова версія, ви можете перевірити, чи версія файлу 11.0.50727.1 (VS2012 RTM) або 11.0.51106.1 (оновлення 1 для VS2012).
11.0.61030.0
), мають версію 11.0.60610.1
для бінарних файлів ATL та MFC та 11.0.51106.1
для всього іншого, наприклад, msvcp110.dll та msvcr110.dll. Не знаю чому. Ви можете підтвердити це (на машинах Windows 10, на яких я тестував), перейшовши C:\ProgramData\Package Cache\{BD95A8CD-1D9F-35AD-981A-3E7925026EBB}v11.0.61030\packages\vcRuntimeMinimum_x86
та C:\ProgramData\Package Cache\{B175520C-86A2-35A7-8619-86DC379688B9}v11.0.61030\packages\vcRuntimeAdditional_x86
оглянувши файли у файлах .cab.
Я натрапив на це питання, шукаючи відповіді в контексті перевірки наявності перерозподілюваного 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>
Редагувати Я оновлюю цю відповідь базовою інформацією про створення та використання спеціальної дії.
Щоб створити власну дію в Visual Studio 2017 із встановленим розширенням WiX Toolset Visual Studio 2017, я використовував шаблон проекту, щоб створити власну дію (C # Custom Action Project for WiX v3).
Я перевірив згенерований проект, і, здавалося, зміни вже вказані на початку цієї статті: https://www.codeproject.com/Articles/132918/Creating-Custom-Action-for-WIX-Written-in-Managed тож я вибрав цю статтю в розділі Adding Custom Action to the Installer
і переглянув її за допомогою деяких змін.
Ще одне, що я зробив - це змінити версію .NET Framework, на якій проект побудований на 3.5.
Я не вважаю це дійсно корисним, але ви також можете побачити http://wixtoolset.org/documentation/manual/v3/wixdev/extensions/authoring_custom_action.html
Для мене це місце працювало: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ DevDiv \ vc \ Обслуговування \ 11.0 \ RuntimeMinimum \ Версія
Перевірте, яка версія у вас після встановлення пакета, і використовуйте це як умову у своєму інсталяторі. (після встановлення VCred встановлено значення 11.0.50727).
Просто перейдіть до Панелі управління> Програми та функції, і всі вони з'являються у списку там.
Я не експерт, і ця відповідь є досить простою порівняно з тим, що люди відповідають (перевіряють реєстр), тому я не впевнений, що це правильна відповідь, але це зробило для мене хитрість.
Мені вдалося це зробити з InnoSetup.
Я перевірив наявність ключа реєстру:
HKLM\SOFTWARE\Microsoft\VisualStudio\11.0\VC\Runtimes
Якщо її видалити, вона не існує. Якщо він встановлений, він існує.
До речі, це також може бути у вузлі Wow6432:
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\11.0\VC\Runtimes
Перевірка стану встановлення продукту за допомогою MsiQueryProductState - це майже рівнозначна безпосередньо перевірка реєстру, але вам все одно потрібен GUID для ProductCode .
Як було зазначено в іншому місці, один недолік цих підходів полягає в тому, що кожне оновлення має свій ProductCode!
На щастя, MSI забезпечує UpgradeCode, який ідентифікує "сімейство" продуктів. Ви можете використовувати orca для відкриття однієї з MSI для отримання цієї інформації. Наприклад, оновлений код оновлення для VS2015 є{65E5BD06-6392-3027-8C26-853107D3CF1A}
Ви можете використовувати MsiEnumRelatedProducts, щоб отримати всі ідентифікатори продукту для цього UpgradeCode. На практиці, оскільки кожне оновлене оновлення замінює попереднє, це дасть лише один ProductCode - наприклад, {B5FC62F5-A367-37A5-9FD2-A6E137C0096F}
для VS2015 Update 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 ++ реєструють свою деінсталятор разом із вікнами (так це відображається у списку "Програми та функції" на панелі керування), ми просто перевіряємо, чи відображається ім'я ключа видалення в реєстрі.
Ось відповідний код NSIS:
ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{33d1fd90-4274-48a1-9bc1-97e33d9c2d6f}\" "DisplayName"
StrCmp $0 "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, не вимагаючи чітко перевіряти обидві клавіші.
Також зауважте, що для оновлення вищевказаного коду до іншої версії Redist VC ++, просто змініть GUID у шляху ключа реєстру та відображуваного імені на все, що вам потрібно.
Хоча це може бути не рекомендованим методом, він працював на 10 000+ машинах протягом останніх 10 років, використовуючи будь-який смак Windows з XP / XP64 Через Windows 10, використовуючи перелік 2005, 2010, 2010sp1 та 2012 2012u4.
Що більшість людей пропускає - це потрібно /reg:32
перевірити ключ на Windows x64.
Див. Статтю довідки Microsoft з цього приводу.
Ось сценарій, який демонструє, як правильно перевірити наявність перерозподілюваного Visual C ++ для оновлення Visual Studio 2012 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\11.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\11.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
Рішення сценарію повноважень:
На основі інформації у відповіді від @kayleeFrye_onDeck
Я створив скрипт powerhell, який перевіряє та встановлює версії, які вказує користувач, я не робив обширного тестування з ним, але для мого власного сценарію CI (Continuous Integration) він працює чудово.
Повний сценарій та інформація про github
Я використовував підхід, який базувався на перевірці режимів на основі наведеної тут інформації. Далі йде суть того, що робить сценарій:
function Test-RegistryValue {
param (
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]$Path,
[parameter(Mandatory=$true)]
[ValidateNotNullOrEmpty()]$Value
)
try {
Get-ItemProperty -Path "$($Path+$Value)" -ErrorAction Stop | Out-Null
return $true
}
catch {
return $false
}
}
Перевірка / завантаження / безшумна установка, на основі $redistInfo
якої міститься складена інформація з kayleeFrye_onDeck's.
$redistInstalled = Test-RegistryValue -Path $redistInfo.RegPath -Value $redistInfo.RegValue
if($redistInstalled -eq $False) {
Invoke-WebRequest -Uri $redistInfo.DownloadUrl -OutFile $downloadTargetPath
Start-Process -FilePath $downloadTargetPath -ArgumentList "$($redistInfo.SilentInstallArgs)" -Wait -NoNewWindow | Wait-Process
}
Повний сценарій та більше інформації можна знайти на github
Будь-хто бажає зробити свій внесок, якщо у мене буде час, я проведу більш масштабне тестування сценарію та продовжую намагатися додавати нові пакунки, оскільки тут додається інформація.
Важко отримати всі значення реєстру для VC 2012, тому я написав невелику функцію, яка буде проходити всі залежності і відповідати заданій версії.
public static bool IsVC2012Installed()
{
string dependenciesPath = @"SOFTWARE\Classes\Installer\Dependencies";
using (RegistryKey dependencies = Registry.LocalMachine.OpenSubKey(dependenciesPath))
{
if (dependencies == null) return false;
foreach (string subKeyName in dependencies.GetSubKeyNames().Where(n => !n.ToLower().Contains("dotnet") && !n.ToLower().Contains("microsoft")))
{
using (RegistryKey subDir = Registry.LocalMachine.OpenSubKey(dependenciesPath + "\\" + subKeyName))
{
var value = subDir.GetValue("DisplayName")?.ToString() ?? null;
if (string.IsNullOrEmpty(value)) continue;
if (Regex.IsMatch(value, @"C\+\+ 2012")) //here u can specify your version.
{
return true;
}
}
}
}
return false;
}
Залежності:
using System.Text.RegularExpressions;
using Microsoft.Win32;
using System.Linq;
Ви можете шукати в реєстрі. Фактично у мене немає 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
Ви можете використовувати функцію реєстру для цього ......
HKLM\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\VC\VCRedist\...