NSIS安装程序 - 定义安装程序和系统x32/x64

4
我正在尝试为我的应用程序设置正确的安装文件夹。 我能否检测出安装程序是32位还是64位系统? 因为现在当我在x64系统上安装x32应用程序时,InstallDir是不正确的。
我有一个x32和x64安装程序的构建脚本,并使用x64.nsh定义程序文件路径。但是问题在于:即使安装程序检测到x64系统,如果当前构建是x32,它仍将安装在“C:\Program Files”而不是“C:\Program Files (x86)”中。
在最坏的情况下,我将不得不为两个安装程序(x32、x64)创建两个构建脚本,但我想避免这种情况。
因此,是否有任何方法可以定义安装程序是32位还是64位系统?
2个回答

3

我曾遇到相同的问题。最终使用了一个包装脚本,将应用程序的架构传递给nsi脚本(makensis.exe /DARCH=x86/x64),在nsi脚本中添加以下类似内容:

${If} ${RunningX64}
  ${If} ${ARCH} == "x64"
    StrCpy $InstDir "$PROGRAMFILES64\${PROGNAME}"
  ${Else}
    StrCpy $InstDir "$PROGRAMFILES32\${PROGNAME}"
  ${Endif}
${Else}
  ${If} ${ARCH} == "x64"
    Quit
  ${Else}
    StrCpy $InstDir "$PROGRAMFILES\${PROGNAME}"
  ${Endif}
${EndIf}

0

如果您要安装的应用程序始终为32位,则只需使用InstallDir "$ProgramFiles\MyApp"

如果安装程序包含相同应用程序的32位和64位版本,并且您想要安装“本机”版本,则必须在.onInit中自己设置$InstDir:

!include LogicLib.nsh
!include x64.nsh
; Don't use InstallDir[RegKey] so $InstDir is empty by default

Function .onInit
${If} $InstDir == "" ; Don't override setup.exe /D=c:\custom\dir
    ${If} ${RunningX64}
        StrCpy $InstDir "$ProgramFiles64\MyCompany\MyApp"
    ${Else}
        StrCpy $InstDir "$ProgramFiles32\MyCompany\MyApp"
    ${EndIf}
${EndIf}
FunctionEnd

Section
SetOutPath $InstDir
${If} ${RunningX64}
    File "AMD64\myapp.exe"
${Else}
    File "i386\myapp.exe"
${EndIf}
SectionEnd

1
首先,感谢您的答复,它很有帮助。但是问题更加复杂。当我使用您的.onInit函数来构建X32安装程序时,然后在X64系统上运行它时,instdir始终为"C:\Program Files",似乎无法更改它。我必须将x32 / x64应用程序安装到同一文件夹中,但在正确的PROGRAMFILES目录下(“C:\ Program Files \ Company \”<files here>或“C:\ Program Files(x86)\ Company \”<files here>)最终我制作了两个安装程序:
  • x32版本对于两个系统都使用$ PROGRAMFILES32
  • x64版本对于x64使用$ PROGRAMFILES64,并防止在x32上运行
- Przunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接