Comsci's answer(Martin's answer 改编)很接近,但没有正确执行版本检查。 (例如,如果次要版本中有一个凸起并且内部版本号重置为零,它将失败。)这是该答案的更正版本,适用于 32 位和 64 位 Visual Studio 2015-2019 软件包。
我发现当前的 64 位软件包如果已经安装会破坏运行时,所以在安装之前检查是必要的(直到微软修复了这个问题)。编辑:这可能已在 Visual Studio 16.10 (release notes) 中修复。
与原始答案一样,这是基于Microsoft recommended way of determining whether the VC Redistributable is installed。
[Files]
Source: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\v142\vcredist_x86.exe; DestDir: {tmp}; Flags: deleteafterinstall ignoreversion
Source: C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Redist\MSVC\v142\vcredist_x64.exe; DestDir: {tmp}; Flags: deleteafterinstall ignoreversion; Check: IsWin64
[Run]
Filename: {tmp}\vcredist_x86.exe; Parameters: /quiet /norestart; StatusMsg: "{#VCmsg32}"; Check: not VCRuntime32Installed
Filename: {tmp}\vcredist_x64.exe; Parameters: /quiet /norestart; StatusMsg: "{#VCmsg64}"; Check: IsWin64 and not VCRuntime64Installed
[Code]
function VCRuntime32Installed: Boolean;
var
required_major: Cardinal;
required_minor: Cardinal;
required_bld: Cardinal;
required_rbld: Cardinal;
major: Cardinal;
minor: Cardinal;
bld: Cardinal;
rbld: Cardinal;
key: String;
begin
required_major := 14;
required_minor := 29;
required_bld := 30037;
required_rbld := 0;
Result := False;
key := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X86';
if RegQueryDWordValue(HKLM32, key, 'Major', major) then begin
if RegQueryDWordValue(HKLM32, key, 'Minor', minor) then begin
if RegQueryDWordValue(HKLM32, key, 'Bld', bld) then begin
if RegQueryDWordValue(HKLM32, key, 'Rbld', rbld) then begin
Log('vcruntime (x86) version: ' + IntToStr(major) + '.' + IntToStr(minor) + '.' + IntToStr(bld) + '.' + IntToStr(rbld));
Result := (major > required_major) or ((major = required_major) and ((minor > required_minor) or ((minor = required_minor) and ((bld > required_bld) or ((bld = required_bld) and (rbld >= required_rbld))))))
end;
end;
end;
end;
end;
function VCRuntime64Installed: Boolean;
var
required_major: Cardinal;
required_minor: Cardinal;
required_bld: Cardinal;
required_rbld: Cardinal;
major: Cardinal;
minor: Cardinal;
bld: Cardinal;
rbld: Cardinal;
key: String;
begin
required_major := 14;
required_minor := 29;
required_bld := 30037;
required_rbld := 0;
Result := False;
key := 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\X64';
if RegQueryDWordValue(HKLM64, key, 'Major', major) then begin
if RegQueryDWordValue(HKLM64, key, 'Minor', minor) then begin
if RegQueryDWordValue(HKLM64, key, 'Bld', bld) then begin
if RegQueryDWordValue(HKLM64, key, 'Rbld', rbld) then begin
Log('vcruntime (x64) version: ' + IntToStr(major) + '.' + IntToStr(minor) + '.' + IntToStr(bld) + '.' + IntToStr(rbld));
Result := (major > required_major) or ((major = required_major) and ((minor > required_minor) or ((minor = required_minor) and ((bld > required_bld) or ((bld = required_bld) and (rbld >= required_rbld))))))
end;
end;
end;
end;
end;