【问题标题】:How to add x86 and x64 VC++ 2019 Redistributables in single Inno Setup installer?如何在单个 Inno Setup 安装程序中添加 x86 和 x64 VC++ 2019 Redistributables?
【发布时间】:2020-09-25 10:31:15
【问题描述】:

我正在尝试在单个设置中添加可再分发的两种架构 [x32 和 x64] VC++ 2019 (v14.26.28720.03)。我编译成功,但在运行时我在ExtractTemporaryFile('#VcInstall'); 中遇到异常

;Version: v14.26.28720.03
[Setup]
#if arch == "x32"
  #define VcInstall "VC_redist.x86.exe"
#else
  #define VcInstall "VC_redist.x64.exe"
#endif

[Files]
Source: ".\Redist\{#VcInstall}"; DestDir: {tmp}; Flags: dontcopy

[Run]
Filename: "{tmp}\{#VcInstall}"; Parameters: "/q /norestart"; \
    Check: VC2019RedistNeedsInstall; Flags: waituntilterminated; \
    StatusMsg: "Installing VC++ 2019 redistributables..." 
[Code]
function VC2019RedistNeedsInstall: Boolean;
var 
  Version: String;
begin
  if (RegQueryStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\x64', 'Version', Version)) then
  begin
    Log('VC Redist Version check : found ' + Version);
    Result := (CompareStr(Version, 'v14.26.28720.03')<0);
  end
    else 
  begin
    Result := True;
  end;
  if (Result) then
  begin
    ExtractTemporaryFile('#VcInstall');
  end;
end;

我在运行时遇到异常ExtractTemporaryFile('#VcInstall');

内部错误:找不到#VcInstall


我的解决方案基于@Martin 的回答:

[Code]
function VC2019RedistNeedsInstall(Arch: string): Boolean;
var 
  Version: String;
begin
  Result := True;
  if Arch = 'x64' then
  begin
    if RegKeyExists( HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{CB4A0FDE-1126-4AE2-97C6-A243692C3D95}') then
    begin
      Log('VC Redist Version check : found ');
      Result := False;
    end;
  end;
  if Arch = 'x32' then
  begin
    if RegKeyExists( HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2F69FB2B-2C48-491C-B249-22C1BDCE1117}') then
    begin
      Log('VC Redist Version check : found ');
      Result := False;
    end;
  end;
end;

【问题讨论】:

  • Arch 参数的意义在于避免重复仅相差x86/x64 的代码。 – 如果您的变量部分是 GUID,请将 GUID 放在参数中。

标签: inno-setup 32bit-64bit pascalscript


【解决方案1】:

您的VcInstall 代码是预处理器代码。它在编译时执行,因此它会考虑您的开发机器架构。你想要什么。

改为使用Is64BitInstallModeIsWin64(阅读他们的文档以根据您的需要选择正确的)。并且您需要无条件地将可再分发的两个版本都包含在您的安装程序中。

[Files]
Source: ".\Redist\VC_redist.x86.exe"; DestDir: {tmp}
Source: ".\Redist\VC_redist.x64.exe"; DestDir: {tmp}

[Run]
Filename: "{tmp}\VC_redist.x86.exe"; Parameters: "/q /norestart"; \
    Check: Is64BitInstallMode and VC2019RedistNeedsInstall('x86'); \
    Flags: waituntilterminated; \
    StatusMsg: "Installing VC++ 2019 redistributables..."
Filename: "{tmp}\VC_redist.x64.exe"; Parameters: "/q /norestart"; \
    Check: (not Is64BitInstallMode) and VC2019RedistNeedsInstall('x64'); \
    Flags: waituntilterminated; \
    StatusMsg: "Installing VC++ 2019 redistributables..."
[Code]
function VC2019RedistNeedsInstall(Arch: string): Boolean;
var 
  Version: String;
begin
  if RegQueryStringValue(
       HKEY_LOCAL_MACHINE,
       'SOFTWARE\Microsoft\VisualStudio\14.0\VC\Runtimes\' + Arch,
       'Version', Version) then
  begin
    Log('VC Redist Version check : found ' + Version);
    Result := (CompareStr(Version, 'v14.26.28720.03')<0);
  end;
end;

(未经测试)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 2010-11-06
    • 2010-09-08
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    相关资源
    最近更新 更多