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_architecturesallowed, https://jrsoftware.org/ishelp/index.php?topic=isxfunc_isarm64)
有没有内置的方法可以做到这一点?
如果没有,我可能必须尝试一些直接系统调用,例如如何检测Windows是否支持运行x64进程?.
中提到的那些正如您链接的问题所示,您可以在 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版本。
使用InnoSetup 6.3.0或更高版本并添加:
ArchitecturesAllowed=x64compatible
ArchitecturesInstallIn64BitMode=x64compatible