Here are some tips for creating (32-bit) NSIS installer which installs 64-bit application on 64-bit Windows.
There is no 64-bit NSIS Installer (yet) so only 32-bit version will be running on 64-bit host which means that 32-bit redirection will take place: by default its Installation Directory is "C:\Program Files (x86)" and it reads/writes only from HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node portion of the registry. This is not what we want so we need to enable access to native Win64 directories/registry for our Installer.
Our installer, as 32-bit application, will probably be used both for 32-bit and 64-bit installations. It therefore needs to be able to determine architecture of the CPU it runs on. x64 plug-in offers macro RunningX64 which returns true if installer is running on 64-bit Windows (under WoW64 emulation):
setup.nsi:
Once we've detected 64-bit host, we need to:
setup.nsi:
If installer needs to detect whether some 64-bit process is running, use FindProcDLL plug-in (there are couple of versions available but I found only this one - FindProcDLL_mod_by_hnedka.7z - working for me; please have a look at this forum thread). Download this archived file, unpack it and copy FindProcDLL.dll to your ..\NSIS\Plugins directory.
setup.nsi:
There is no 64-bit NSIS Installer (yet) so only 32-bit version will be running on 64-bit host which means that 32-bit redirection will take place: by default its Installation Directory is "C:\Program Files (x86)" and it reads/writes only from HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node portion of the registry. This is not what we want so we need to enable access to native Win64 directories/registry for our Installer.
Our installer, as 32-bit application, will probably be used both for 32-bit and 64-bit installations. It therefore needs to be able to determine architecture of the CPU it runs on. x64 plug-in offers macro RunningX64 which returns true if installer is running on 64-bit Windows (under WoW64 emulation):
setup.nsi:
!include x64.nsh
...
${If} ${RunningX64}
DetailPrint "Installer running on 64-bit host"
${EndIf}
...
${If} ${RunningX64}
DetailPrint "Installer running on 64-bit host"
${EndIf}
Once we've detected 64-bit host, we need to:
- set "C:\Program Files" as Installation Directory - use $PROGRAMFILES64 instead of $PROGRAMFILES
- enable access to 64-bit registry - use SetRegView NSIS command
setup.nsi:
!include x64.nsh
;set initial value for $INSTDIR
InstallDir "$PROGRAMFILES\${MY_COMPANY}\${MY_APP}"
...
${If} ${RunningX64}
DetailPrint "Installer running on 64-bit host"
; disable registry redirection (enable access to 64-bit portion of registry)
SetRegView 64
; change install dir
StrCpy $INSTDIR "$PROGRAMFILES64\${MY_COMPANY}\${MY_APP}"
${EndIf}
;set initial value for $INSTDIR
InstallDir "$PROGRAMFILES\${MY_COMPANY}\${MY_APP}"
...
${If} ${RunningX64}
DetailPrint "Installer running on 64-bit host"
; disable registry redirection (enable access to 64-bit portion of registry)
SetRegView 64
; change install dir
StrCpy $INSTDIR "$PROGRAMFILES64\${MY_COMPANY}\${MY_APP}"
${EndIf}
If installer needs to detect whether some 64-bit process is running, use FindProcDLL plug-in (there are couple of versions available but I found only this one - FindProcDLL_mod_by_hnedka.7z - working for me; please have a look at this forum thread). Download this archived file, unpack it and copy FindProcDLL.dll to your ..\NSIS\Plugins directory.
setup.nsi:
${If} ${RunningX64}
FindProcDLL::FindProc "Some64BitProcess.exe"
${If} $R0 == 1
DetailPrint "FindProcDLL::FindProc() returned 1 (process is running)"
${ElseIf} $R0 == 0
DetailPrint "FindProcDLL::FindProc() returned 0 (process is not running)"
${Else}
DetailPrint "FindProcDLL::FindProc() returned unexpected value"
${Endif}
${Else}
...
FindProcDLL::FindProc "Some64BitProcess.exe"
${If} $R0 == 1
DetailPrint "FindProcDLL::FindProc() returned 1 (process is running)"
${ElseIf} $R0 == 0
DetailPrint "FindProcDLL::FindProc() returned 0 (process is not running)"
${Else}
DetailPrint "FindProcDLL::FindProc() returned unexpected value"
${Endif}
${Else}
...
2 comments:
If you need to install either a 32-bit or 64-bit file, you can do this:
${If} ${RunningX64}
File "/oname=MyFile.exe" "files\MyFile64.exe"
${Else}
File "files\MyFile.exe"
${EndIf}
If you need to register a DLL, you can do this:
${If} ${RunningX64}
ExecWait 'regsvr32.exe /s "$INSTDIR\MyDLL.dll"'
${Else}
RegDLL "$INSTDIR\MyDLL.dll"
${EndIf}
(Or use Library.nsh)
This is just 0,01 % of the whole story. Biggest pain is to compile / debug excisting script.
Post a Comment