3

我正在尝试为我的应用程序设置正确的安装文件夹。 我可以检测安装程序是用于 32 位还是 64 位系统?因为现在当我在 x64 系统上安装 x32 应用程序时,InstallDir 不正确。

我有一个用于 x32 和 x64 安装程序的构建脚本,我使用x64.nsh来定义程序文件路径。但这里有个问题:即使安装程序检测到 x64 系统,如果当前版本是 x32,它仍然会安装在“C:\Program Files”而不是“C:\Program Files (x86)”。

在最坏的情况下,我将不得不为两个安装程序(x32、x64)创建两个构建脚本,但我想避免它。

那么,有什么方法可以定义安装程序是用于 32 位还是 64 位系统?

4

2 回答 2

2

我遇到过同样的问题。最终使用了一个将应用程序的拱形传递给 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}
于 2015-03-18T16:35:39.817 回答
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
于 2013-10-15T16:56:00.303 回答