Installation 是否可以使用一个NSIS安装程序在32位操作系统上安装32位二进制文件,在64位操作系统上安装64位二进制文件?

Installation 是否可以使用一个NSIS安装程序在32位操作系统上安装32位二进制文件,在64位操作系统上安装64位二进制文件?,installation,nsis,Installation,Nsis,我目前有两个WIX安装程序用于我维护的产品。一个用于32位操作系统,一个用于64位操作系统。我不想维护两个独立的安装程序,而是想将它们组合成一个NSIS安装程序,它可以“确定”操作系统的“位”,然后将适当的二进制文件复制到程序目录中。有没有人对此有经验,可以提供NSIS可以用来制作安装程序的工作示例脚本?有一些帮助宏,您可以安装到$programfiles32或$programfiles64 编辑: Function .onInit StrCpy $instdir $programfiles32

我目前有两个WIX安装程序用于我维护的产品。一个用于32位操作系统,一个用于64位操作系统。我不想维护两个独立的安装程序,而是想将它们组合成一个NSIS安装程序,它可以“确定”操作系统的“位”,然后将适当的二进制文件复制到程序目录中。有没有人对此有经验,可以提供NSIS可以用来制作安装程序的工作示例脚本?

有一些帮助宏,您可以安装到
$programfiles32
$programfiles64

编辑:

Function .onInit
StrCpy $instdir $programfiles32\MyApp
${If} ${RunningX64}
  StrCpy $instdir $programfiles64\MyApp
${EndIf}
FunctionEnd

...

Section
Setoutpath $instdir
${If} ${RunningX64}
  File /r build\64\*
${Else}
  File /r build\32\*
${EndIf}
SectionEnd

我相信我已经明白了。。。我还没有测试过这个,但它应该可以工作

答案是为每组文件创建两个“部分”<对于32位文件,代码>SEC0000;对于64位文件,代码>SEC0001。那么

!include x64.nsh

Function .onInit
  #Determine the bitness of the OS and enable the correct section
  ${if} ${RunningX64}
    SectionSetFlags ${SEC0001} 17
    SectionSetFlags ${SEC0000} 16
  ${else}
    SectionSetFlags ${SEC0001} 16
    SectionSetFlags ${SEC0000} 17
  ${endif}
FunctionEnd

我相信在
un.onInit
功能中也需要相同的逻辑,以便卸载程序知道要删除哪些文件…

对于使用3.0a0的简单通用安装程序,我通过一些实验发现以下方法对我有效:

!include x64.nsh
Function .onInit
  #Determine the bitness of the OS and enable the correct section
  ${If} ${RunningX64}
    SectionSetFlags ${SEC0000}  ${SECTION_OFF}
    SectionSetFlags ${SEC0001}  ${SF_SELECTED}
  ${Else}
    SectionSetFlags ${SEC0001}  ${SECTION_OFF}
    SectionSetFlags ${SEC0000}  ${SF_SELECTED}
  ${EndIf}
FunctionEnd
我只需要记住将函数放在引用的部分之后。我的每个部分只是在各自的32位/和64位/目录中引用了一个同名的.exe,因此我的卸载程序不需要任何特殊处理。我还没有在32位系统上测试过它,但在64位系统上确实有效

例如:

section "64-bit" SEC0001
  messageBox MB_OK "64-BIT!"
  File "C:\foo\64-bit\some-utility.exe"
sectionEND

我确实看过这个,它将允许我确定操作系统的位,但我仍然遇到问题,我需要告诉安装程序要安装哪些文件。我目前有一个“部分”包含以下内容:
SetOutPath${programmainstall}File/r build\\*
,所以我不确定x64模块在这种情况下是否有帮助……另外,我没有在64位系统上安装32位二进制文件。。。我正在64位操作系统上安装64位文件,在32位操作系统上安装32位文件…@julianeastering这会告诉系统要安装哪些文件。如果将64位文件放在
build\64
中,将32位文件放在
build\32
中。如果您还需要根据体系结构更改安装目录,则可以将
SetOutPath
放入If/els中。为此,您需要
!在脚本中包含“Sections.nsh”
,因为所选的
SF\u
SELECTED是
Sections.nsh的一部分