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

时间:2012-06-20 19:18:18

标签: installer nsis

我目前为我维护的产品安装了两个WIX。一个用于32位操作系统,一个用于64位操作系统。我想将它们组合成一个NSIS安装程序,而不是维护两个单独的安装程序,它可以“确定”操作系统的“位数”,然后将相应的二进制文件复制到程序目录中。有没有人有这方面的经验,可以提供NSIS可以用来制作安装程序的工作样本脚本吗?

3 个答案:

答案 0 :(得分:11)

x64.nsh有一些辅助宏,您可以安装到$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

答案 1 :(得分:4)

我相信我明白了......我还没有测试过这个,但它应该有用......

答案是为每组文件创建两个“部分”。 SEC0000表示32位,SEC0001表示64位文件。然后,

!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函数也需要相同的逻辑,因此卸载程序知道要删除哪些文件......

答案 2 :(得分:4)

对于使用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