$PROGRAMFILES on x64
I want to install my "64-BIT" executable binaries on "C:\Program Files\MyApp".
But NSIS $PROGRAMFILES variable always indicates
"C:\Program Files (x86)".
How can I correct this problem?
Thanks in advance.
Archive: $PROGRAMFILES on x64
$PROGRAMFILES on x64
I want to install my "64-BIT" executable binaries on "C:\Program Files\MyApp".
But NSIS $PROGRAMFILES variable always indicates
"C:\Program Files (x86)".
How can I correct this problem?
Thanks in advance.
!include x64.nsh
Surely included that file,
and I also tried $(DisableX64FSRedirection) in .onInit,
but same problem...
; RunningX64 checks if the installer is running on x64.
;
; ${If} ${RunningX64}
; MessageBox MB_OK "running on x64"
; ${EndIf}
;
; DisableX64FSRedirection disables file system redirection.
; EnableX64FSRedirection enables file system redirection.
;
; ${DisableX64FSRedirection}
; DetailPrint $SYSDIR # prints C:\Windows\System32
; ${EnableX64FSRedirection}
; DetailPrint $SYSDIR # prints C:\Windows\SysWOW64
Something like this should be the way to go:
!include x64.nsh
Function .onInit
${If} ${RunningX64}
${EnableX64FSRedirection}
${else}
MessageBox MB_OK "Sorry this application runs only on x64 machines"
Abort
${EndIf}
StrCpy '$INSTDIR' '$PROGRAMFILES\My Application'
FunctionEnd
You should actually disable redirection only right before using something that relies on it and enable it back right away. If you don't, some weird stuff can happen.
Thank you but still not solved.
I tested the following 3 msgboxes in .onInit,
MsgBox MB_OK "$PROGRAMFILES 1"
${DisableX64FSRedirection}
MsgBox MB_OK "$PROGRAMFILES 2"
${EnableX64FSRedirection}
MsgBox MB_OK "$PROGRAMFILES 3"
All output contained "(x86)"...
But maybe I'm wrong because
$SYSDIR (instead of $PROGRAMFILES) was also
not changed at these 3 msgbox test.
Can you attach your complete test script
Just in case...
!include x64.nsh
Function .onInit
${If} ${RunningX64}
${EnableX64FSRedirection}
${else}
MessageBox MB_OK "Sorry this application runs only on x64 machines"
Abort
${EndIf}
FunctionEnd
Section -
Detailprint '$SYSDIR'
DetailPrint '$WINDIR'
DetailPrint '$PROGRAMFILES'
SectionEnd
Thanks,
!include "MUI.nsh"
!include "x64.nsh"
Name "Modern UI Test"
OutFile "Basic.exe"
InstallDir "$PROGRAMFILES\Modern UI Test"
InstallDirRegKey HKCU "Software\Modern UI Test" ""
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section "Dummy Section" SecDummy
SetOutPath "$INSTDIR"
WriteRegStr HKCU "Software\Modern UI Test" "" $INSTDIR
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
Section "Uninstall"
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
DeleteRegKey /ifempty HKCU "Software\Modern UI Test"
SectionEnd
Function .onInit
${If} ${RunningX64}
${EnableX64FSRedirection}
${Else}
MessageBox MB_OK "x64 test only"
Abort
${EndIf}
FunctionEnd
Section -
DetailPrint '$SYSDIR'
DetailPrint '$WINDIR'
DetailPrint '$PROGRAMFILES'
MessageBox MB_OK "$PROGRAMFILES 1"
${DisableX64FSRedirection}
MessageBox MB_OK "$PROGRAMFILES 2"
${EnableX64FSRedirection}
MessageBox MB_OK "$PROGRAMFILES 3"
SectionEnd
Output folder: C:\Program Files (x86)\Modern UI Test
Created uninstaller: C:\Program Files (x86)\Modern UI Test\Uninstall.exe
C:\WINDOWS\system32
C:\WINDOWS
C:\Program Files (x86)
Completed
Everything appears as expected in your script, though, the redirection seems that fails. I don't know what else to think. Since I have not x64 system I can't help further.
The problem with $PROGRAMFILES is that it's read from the registry. The same goes to $COMMONFILES. What should happen, is that SHGetSpecialFolderLocation should be called first and then, only if it failed, the registry should be read. Please submit a bug report about this.