2013-10-15 2 views
2

내 응용 프로그램에 맞는 설치 폴더를 설정하려고합니다. 설치 프로그램이 32 비트 또는 64 비트 시스템 용인지 감지 할 수 있습니까? 이제 x64 시스템에 x32 응용 프로그램을 설치하면 InstallDir이 올바르지 않습니다.NSIS 설치 프로그램 - 설치 프로그램 및 시스템 정의 x32/x64

x32 및 x64 설치 프로그램 용 빌드 스크립트가 하나 있는데 x64.nsh을 사용하여 프로그램 파일 경로를 정의합니다. 그러나 여기에 문제가 있습니다 : 설치 프로그램이 x64 시스템을 감지하더라도 현재 빌드가 x32이면 "C : \ Program Files (x86)"대신 "C : \ Program Files"에 계속 설치됩니다.

최악의 경우 두 설치자 (x32, x64)에 대해 두 개의 빌드 스크립트를 만들어야하지만 필자는이를 피하고 싶습니다.

그래서 설치자이 32 또는 64 비트 시스템 용인지 확인하는 방법이 있습니까?

답변

1

나는 동일한 문제가있었습니다. 모두의

${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 비트 및 64 비트 버전이 모두 포함되어있는 경우 항상 32 비트됩니다 설치하는 응용 프로그램이 다음 단지 InstallDir "$ProgramFiles\MyApp"

를 사용하고 당신이 $를 설정해야하는 "기본"버전을 설치하려면 .InInit에 직접 입력하십시오 :

!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

먼저 감사를 다음 NSI 스크립트 자체에 이런 래퍼 NSI 스크립트 응용 프로그램의 아치를 통과 스크립트 (makensis.exe/DARCH = 86/64) 뭔가를 사용하여 종료 당신의 대답은 도움이되었습니다. 그러나 문제는 더욱 복잡합니다. .onInit 함수를 사용하여 X32 설치 프로그램을 빌드 할 때 X64 시스템에서 실행하면 instdir은 항상 "C : \ Program Files"로 변경 될 수 없습니다. 내가 같은 폴더에 있지만 적절한 PROGRAMFILES 디렉토리에 X32/64 응용 프로그램을 설치해야합니다 ("C가 : \ 프로그램 파일 \ 회사 \" 또는 "c : \의 Program Files (x86) \ 회사 \"는) 나는 종료 - x32 버전은 두 시스템 모두에 $ PROGRAMFILES32를 사용합니다. - x64 버전은 x64에 $ PROGRAMFILES64를 사용하고 x32에는 실행되지 않도록합니다. – Przunk

관련 문제