我已经创建了一个MSI包(在Orca中)。摘要信息中的Platform字段显示"x64;1033"。这台机器是64位的。模式版本,如果重要的话,是400。
当我使用MSIExec像这样运行它时:
msiexec/qn/li a.txt/i b.msi
我可以看到它在32位进程中执行。不是预期的结果。
为了检查,我在HKLMSOFTWARE -Bits
, REG_SZ下放置了一个值"64",在HKLMSOFTWAREWOW6432Node下放置了一个类似的值,但值"32",并且我在安装序列的早期自定义JScript操作中转储该值。我得到"32"
我运行的msiexec
的副本在c:WindowsSystem32下,它是一个64位可执行文件,无论如何都不应该重要,安装程序没有在msiexec进程中运行。
概要信息中的Platform
不会被完全忽略-如果我指定"Intel64",它代表Itanium,我得到一个"不支持的架构"错误。尝试"AMD64"-如果您提供Schema>=500,这是Orca中唯一的选项-相同的结果,32位。
每个自定义动作都有自己的位值. 对于DLL类型的操作,它派生自DLL的目标体系结构。对于不能推断位的脚本类型操作,Type
字段值必须为0x1000 (msidbCustomActionType64BitScript
,十进制4096),用于64位执行上下文。
没有该位设置的脚本操作将在32位环境中执行,即使在其他64位目标MSI中也是如此。这就是我的情况。
当前的问题,正如观察到的,是位校验实现方式的产物。也就是说,在这个特殊的MSI的情况下,有一个自定义动作脚本是不是位不可知的,所以这个问题的根本原因对项目很重要。
假设ARM/ARM64也是如此;我无法测试。
https://learn.microsoft.com/en-us/windows/win32/msi/64-bit-custom-actions