求助:64位MSI包为何在64位系统上以32位进程执行
问题排查与解决:x64 MSI以32位进程运行
核心问题确认
你制作的x64 MSI包(摘要Platform设为x64;1033,架构版本400)在64位系统上通过c:\Windows\System32下的64位msiexec执行时,实际以32位进程上下文运行,自定义JScript读取HKLM\SOFTWARE\Bits返回32位注册表节点的值,验证了WOW64映射生效。
关键排查与修复步骤
1. 补全Property表的Platform属性设置
64位MSI必须在Property表中显式标记架构:
- 打开Orca加载目标MSI
- 切换到
Property表,检查是否存在Platform项 - 若不存在,右键添加行:
Property列填Platform,Value列填x64
2. 修正Template Summary字段
摘要信息的Template字段需完整标记64位属性:
- 在Orca中点击
View->Summary Information - 将
Template字段设置为Intel;1033;x64(对应语言ID1033、x64架构) - 注:架构版本400对应Windows Installer 4.0,Win7及以上系统默认支持该版本的64位包
3. 标记组件为64位
若MSI包含自定义组件,需确保组件属性标记为64位:
- 切换到
Component表,检查Attributes列的值:64位组件需添加0x00000200(msidbComponentAttributes64bit)属性 - 未标记的组件会强制安装程序以32位上下文运行
4. 验证MSI实际架构
用PowerShell命令确认MSI的架构属性:
$msiPath = "C:\path\to\b.msi" $installer = New-Object -ComObject WindowsInstaller.Installer $database = $installer.OpenDatabase($msiPath, 0) $view = $database.OpenView("SELECT Value FROM Property WHERE Property='Platform'") $view.Execute() $record = $view.Fetch() Write-Host "MSI Platform Property: $($record.StringData(1))"
补充说明
- 设置Platform为
Intel64(Itanium)报错,说明摘要字段并非完全无效,只是x64标记未被正确识别为64位包标识 - 架构版本≥500时选
AMD64仍无效,核心原因是Property表未同步设置Platform=x64
内容的提问来源于stack exchange,提问作者Seva Alekseyev
相关产品推荐
相关产品推荐

