2013-10-15 242 views
2

我想为我的应用程序设置正确的安装文件夹。 我可以检测安装程序是否适用于32位或64位系统?因为现在当我在x64系统上安装x32应用程序时,InstallDir不正确。NSIS安装程序 - 定义安装程序和系统x32/x64

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

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

那么,有什么办法来定义,如果安装程序是32位或64位系统?

回答

1

我有同样的问题。最后使用过的应用程序的弓至NSI脚本包装脚本(makensis.exe /达奇= 86/64),并像这样在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

如果要安装始终是32bit的应用程序就用InstallDir "$ProgramFiles\MyApp"

如果安装程序包含两个相同的应用程序的32位和64位版本,你要安装的“原生”的版本,你必须设置$ InstDir自己在.onInit:

!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文件\企业\” 或 “C:\ Program Files文件(x86)的\企业\” ) 我结束使两个安装程序: - 两个系统x32 ver使用$ PROGRAMFILES32 - x64 ver对x64使用$ PROGRAMFILES64,并防止运行x32 – Przunk