Подходы обнаружения во время выполнения
Я могу найти несколько способов обнаружить присутствие Visual C ++ Runtime .
Реестр
Проверка наличия и версии файла
- Проверка наличия основных файлов времени выполнения
- См. Отдельный раздел ниже
MSI API
- Вы можете определить, является ли конкретный MSIустанавливается путем поиска GUID продукта
- Надежно, но трудно отследить все GUID продукта (разные версии)
- UPDATE : Вы также можете использовать код обновлениякак описано ниже.Он должен оставаться стабильным при всех выпусках и обновлениях (для каждой основной версии и, возможно, также между основными версиями).
Fall-Over EXE?
- Предполагается использовать EXE в зависимости от времени выполнения
- Запуск и сбой означает, что время выполнения отсутствует или не работает
Хорошие и плохие - Оценка : Option 1
представляется уязвимой, поскольку вариант модуля слияния развертывания среды выполненияможет не написать эти ключи.Option 3
может хорошо работать, но сложно отследить все GUID.Option 4
, по-видимому, уже потерпел неудачу из-за более новых сред выполнения, удаляющих определенные ключи реестра.Хотя сейчас это исправлено, это может всплыть на поверхность.
Наличие версии файла / проверка версии
Чем больше я смотрю на это, тем больше я начинаю думать, что вы должны проверить фактическуюсами файлы, и, возможно, для правильной версии файла.Файл vcruntime140.dll
в папке System32
(64-разрядная версия) и SysWOW64
папка (32-разрядная версия)? Смотрите список файлов внизу .
Просто добавьте ссылку для хранения.
Тестовый VBScript - только для целей тестирования:
Set fso = CreateObject("Scripting.FileSystemObject")
MsgBox fso.GetFileVersion("C:\Windows\System32\vcruntime140.dll")
Youможет определить наличие и версию файла, используя AppSearch в MSI-файле.
Ниже приведены некоторые другие вещи, которые я написал, просто оставив их.
VCRedist
Кажется, распространяемые пакеты Visual C ++ (VCRedist_x86.exe
, VCRedist_x64.exe
) - рекомендуемый способ развертываниявремя выполнения - проверяет следующий раздел реестра, чтобы определить, какие версии среды выполнения фактически установлены:
HKLM\SOFTWARE\Microsoft\VisualStudio\<version>\VC\Runtimes\
Подключи x86 и x64Кажется, что содержит значение " Установлено ", которое устанавливается на 1 при установке среды выполнения.Я бы предположил - не успев все это проверить - что тогда вы сможете проверить:
HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x64
Installed = 1
HKLM\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\14.0\VC\Runtimes\x86
Installed = 1
Модуль слияния : после краткой проверки эти значения не записываются модулями слияния, которыетакже может быть использован для распространения этой среды выполнения.Сейчас у меня нет времени или средств, чтобы проверить это должным образом.
Удивительно, но и версия 2015, и версия 2017 среды выполнения записывают данные в ключ 14.0, поскольку они двоично совместимы. Если установлена версия 2017 года, то исполняемый файл VCRedist выдаст ошибку, поскольку установка не требуется.Странно действительно.Но для вашей цели это должно быть не в этом. Источник .
MSI API - получение кодов продуктов
Макет :
Public installer
Set installer = CreateObject("WindowsInstaller.Installer")
' Don't have the 2015 GUID
VC2015 = CheckForProductCode("{00000000-0000-0000-0000-000000000000}")
VC2017 = CheckForProductCode("{C77195A4-CEB8-38EE-BDD6-C46CB459EF6E}")
MsgBox "VC2015: " & CStr(VC2015) & vbCrLf & "VC2017: " & CStr(VC2017)
Function CheckForProductCode(productcode)
CheckForProductCode = False
For Each product In installer.ProductsEx("", "", 7)
If(LCase(productcode) = LCase(product.ProductCode)) Then
CheckForProductCode = True
Exit For
End If
Next
End Function
Обновление на основе предложения Zett42 для перечисления совместного использования продуктовтот же код обновления:
Set installer = CreateObject("WindowsInstaller.Installer")
' Enumerate all products related to "Microsoft Visual C++ 2008 Redistributable - x86 9.0.30729.4148"
' {AA783A14-A7A3-3D33-95F0-9A351D530011} is the upgrade code
Set upgrades = installer.RelatedProducts("{AA783A14-A7A3-3D33-95F0-9A351D530011}")
For Each u In upgrades
MsgBox u, vbOKOnly, "Product Code: "
Next
Развертывание среды выполнения Visual Studio C ++
Помимо обнаружения, существует несколько подходов для распространения среды выполнения Visual Studio C ++:
- Статическое связывание
- Распространяемые пакеты Visual C ++
VCRedist_x86.exe
, VCRedist_x64.exe
или VCRedist_arm.exe
Program Files(x86)\Microsoft Visual Studio\2017\edition\VC\Redist\MSVC\lib-version
- Распространяемые модули слияния (
.msm files
) - Недостаточно для некоторых целей ( Универсальный CRT ):
- Локальная папка приложения
- Копирование DLL в локальную папку приложения
- Не рекомендуется по причинам обслуживания (обновления, исправления безопасности)
Ссылки для безопасного хранения :
Старый ответ
Это старое сообщение.Я не слишком люблю прямые чтения реестра, позвольте мне посмотреть, смогу ли я найти более надежный способ, но, может быть, посмотрим, в какое время: Определите, установлен ли распространяемый Visual C ++ для Visual Studio 2012
Еще одна ссылка, как найти код продукта установщика Windows для установленных продуктов: Как найти GUID продукта установленной установки MSI?