You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WIX 3.11中通过WinAPI检测MSI安装环境为ARM64或x86?

检测ARM64系统并适配WiX 3.11安装程序的方案

一、优先推荐的WinAPI检测方法(无需升级最低系统版本)

由于你的x86安装程序运行在ARM64的WoW64模拟环境中,GetSystemInfo/GetNativeSystemInfo会返回模拟的x86架构信息,而IsWow64Process2需依赖Windows 10+。这里提供一种兼容旧系统的动态加载方案,无需修改项目最低版本定义:

C++代码实现

#include <windows.h>
#include <winternl.h>

typedef BOOL(WINAPI* LPISWOW64PROCESS2)(HANDLE, USHORT*, USHORT*);

BOOL IsRunningOnARM64() {
    BOOL isWow64 = FALSE;
    // 先判断是否处于WoW64环境
    if (!IsWow64Process(GetCurrentProcess(), &isWow64) || !isWow64) {
        // 非WoW64环境,直接读取原生系统架构
        SYSTEM_INFO sysInfo;
        GetNativeSystemInfo(&sysInfo);
        return sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ARM64;
    }

    // 动态加载kernel32.dll中的IsWow64Process2函数
    HMODULE hKernel32 = GetModuleHandle(L"kernel32.dll");
    if (!hKernel32) return FALSE;

    LPISWOW64PROCESS2 pfnIsWow64Process2 = (LPISWOW64PROCESS2)GetProcAddress(hKernel32, "IsWow64Process2");
    if (!pfnIsWow64Process2) return FALSE;

    USHORT processArch, nativeArch;
    if (!pfnIsWow64Process2(GetCurrentProcess(), &processArch, &nativeArch)) {
        return FALSE;
    }

    return nativeArch == PROCESSOR_ARCHITECTURE_ARM64;
}

方案优势

  • 兼容Windows 7及以上系统,系统不支持IsWow64Process2时自动 fallback 到原生架构检测逻辑
  • 无需修改项目的_WIN32_WINNT定义,不影响原有兼容性

二、WiX 3.11中QueryNativeMachine的使用方案

WiX 3.11确实支持QueryNativeMachine自定义动作,可直接获取原生系统架构并存入MSI属性,用于后续安装条件判断。

WiX配置示例

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

  <!-- 定义存储原生架构的属性 -->
  <Property Id="NATIVE_MACHINE" />

  <!-- 注册QueryNativeMachine自定义动作 -->
  <CustomAction Id="CA_QueryNativeMachine"
                BinaryKey="WixUtilCA"
                DllEntry="QueryNativeMachine"
                Return="check"
                Execute="immediate" />

  <!-- 设置执行顺序:必须在InstallInitialize之前完成检测 -->
  <InstallExecuteSequence>
    <Custom Action="CA_QueryNativeMachine" Before="InstallInitialize" />
  </InstallExecuteSequence>

  <!-- 用属性控制ARM64文件安装 -->
  <ComponentGroup Id="ARM64_Files" Directory="INSTALLDIR">
    <Component Id="ARM64_Binary" Guid="YOUR-GUID-HERE">
      <File Source="path\to\arm64\target.exe" />
      <Condition><![CDATA[NATIVE_MACHINE="ARM64"]]></Condition>
    </Component>
  </ComponentGroup>

</Wix>

注意事项

  • 必须确保项目已添加WixUtilExtension引用,否则无法找到QueryNativeMachine入口
  • 自定义动作的Execute属性需设为immediate,保证在UI和执行序列中提前执行
  • NATIVE_MACHINE的可能取值:X86、X64、ARM、ARM64

三、两种方案对比

方案优势适用场景
动态WinAPI检测不依赖WiX扩展,代码可控性强自定义动作中需根据架构执行复杂逻辑的场景
WiX QueryNativeMachine无需编写C++代码,WiX原生支持仅需根据架构控制文件安装的简单场景

内容的提问来源于stack exchange,提问作者Loqaritm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:03:21