Inno Setup 可以检测到可以模拟 x64 的 ARM64 硬件上的 Windows11 吗?

问题描述 投票:0回答:2

Windows 11 支持模拟 x64 硬件,同时实际在 ARM64 平台上运行。例如,在 Mac 上的虚拟机中运行 Windows。

以前我的 Inno 安装程序只是使用以下内容来确保 PC 能够运行我们的软件:

ArchitecturesAllowed=x64

但是,在基于 ARM 的系统(如给出的示例)上,这会导致安装终止,因为它(正确地)将

arm64
视为架构。

我不能只将

arm64
添加到该行,因为这无法区分没有 x64 模拟功能的旧版基于 ARM 的系统和具有 x64 模拟功能的系统。

希望在 Inno Setup Google Group 中讨论了该主题,如下:

乔丹·拉塞尔 2021 年 10 月 4 日下午 5:45:40

...

如果他们要切换到“ArchitecturesInstall64BitMode=x64 arm64”, 那么你应该得到 x64 文件。然而不幸的是,x64 文件也会安装在不支持的旧版 ARM64 版本上 x64 模拟,导致应用程序无法运行。

...

不过,我仍然计划添加对检测 x64 的官方支持 在不久的将来进行仿真。新的架构标识符 “x64兼容”将匹配 x64 Windows 和带有 x64 的 ARM64 Windows 仿真支持,并且还将添加 IsX64Compatible 功能。 鼓励采用“x64兼容”,以便更多x64应用程序可以 安装在 ARM64 上,现有的“x64”将被弃用并重命名 到“x64strict”,稍后编译器将在以下情况下打印警告: 使用“x64”。

然而相关的Inno文档部分似乎没有提到这一点。 (https://jrsoftware.org/ishelp/index.php?topic=setup_architecturesallowedhttps://jrsoftware.org/ishelp/index.php?topic=isxfunc_isarm64)

有没有内置的方法可以做到这一点?

如果没有,我可能必须尝试一些直接系统调用,例如如何检测Windows是否支持运行x64进程?.

中提到的那些
inno-setup emulation arm64 windows-11
2个回答
2
投票

正如您链接的问题所示,您可以在 Windows 11 上调用

GetMachineTypeAttributes
WinAPI 函数 来确定 x64 支持。在旧版本的 Windows 上,使用
ProcessorArchitecture
Inno Setup 支持功能

类似这样的事情应该做(但我没有 ARM64 机器来测试这个)。

[Code]

const
  IMAGE_FILE_MACHINE_AMD64 = $8664;

function GetMachineTypeAttributes(
    Machine: Word; var MachineTypeAttributes: Integer): HRESULT;
  external '[email protected] stdcall delayload';

<event('InitializeSetup')>
function InitializeSetupCheckArchitecture(): Boolean;
var
  MachineTypeAttributes: Integer;
  Arch: TSetupProcessorArchitecture;
begin
  if IsWindows11OrNewer then
  begin
    OleCheck(
      GetMachineTypeAttributes(IMAGE_FILE_MACHINE_AMD64, MachineTypeAttributes));
    if MachineTypeAttributes <> 0 then
    begin
      Log('Windows 11 or newer, with x64 support');
      Result := True;
    end
      else
    begin
      Log('Windows 11 or newer, without x64 support');
      Result := False;
    end;
  end
    else
  begin
    Arch := ProcessorArchitecture;
    if Arch = paX64 then
    begin
      Log('Windows 10 or older, on x64 architecture');
      Result := True;
    end
      else
    begin
      Log('Windows 10 or older, not on x64 architecture');
      Result := False;
    end;
  end;

  if not Result then
  begin
    MsgBox('This product can be installed on system with x64 support only.',
      mbError, MB_OK);
  end;
end;

该代码完全替换了

ArchitecturesAllowed
指令(它假设未设置它,但将其设置为
x64 arm64
应该不会造成任何损害)。

IsWindows11OrNewer
来自在Inno Setup中确定Windows版本


0
投票

使用InnoSetup 6.3.0或更高版本并添加:

ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible
© www.soinside.com 2019 - 2024. All rights reserved.