如何在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
相关产品推荐
相关产品推荐

