2020-07-31 22:40:03 +00:00
/ *
This example script installs a simple application for a single user .
If multiple users on the same machine run this installer, each user
will end up with a separate install that is not affected by
update/removal operations performed by other users.
Per- user installers should only write to HKCU and
folders inside the users profile.
* /
2021-02-16 13:47:25 +00:00
!define NAME " Per-user example "
2020-07-31 22:40:03 +00:00
!define REGPATH_UNINSTSUBKEY " Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME} "
Name " ${NAME} "
OutFile " Install ${NAME}.exe "
Unicode True
RequestExecutionLevel User ; We don't need UAC elevation
InstallDir " " ; Don't set a default $InstDir so we can detect /D= and InstallDirRegKey
InstallDirRegKey HKCU " ${REGPATH_UNINSTSUBKEY} " " UninstallString "
!include LogicLib.nsh
!include WinCore.nsh
!include Integration.nsh
Page Directory
Page InstFiles
Uninstpage UninstConfirm
Uninstpage InstFiles
Function .onInit
SetShellVarContext Current
${If} $InstDir == " " ; No /D= nor InstallDirRegKey?
GetKnownFolderPath $InstDir ${FOLDERID_UserProgramFiles} ; This folder only exists on Win7+
StrCmp $InstDir " " 0 + 2
StrCpy $InstDir " $LocalAppData \Programs " ; Fallback directory
StrCpy $InstDir " $InstDir \$(^Name) "
${EndIf}
FunctionEnd
Function un.onInit
SetShellVarContext Current
FunctionEnd
2021-02-16 13:47:25 +00:00
2020-07-31 22:40:03 +00:00
Section " Program files (Required) "
SectionIn Ro
SetOutPath $InstDir
WriteUninstaller " $InstDir \Uninst.exe "
WriteRegStr HKCU " ${REGPATH_UNINSTSUBKEY} " " DisplayName " " ${NAME} "
WriteRegStr HKCU " ${REGPATH_UNINSTSUBKEY} " " DisplayIcon " " $InstDir \MyApp.exe,0 "
WriteRegStr HKCU " ${REGPATH_UNINSTSUBKEY} " " UninstallString " '"$InstDir\Uninst.exe"'
2021-02-15 13:52:06 +00:00
WriteRegStr HKCU " ${REGPATH_UNINSTSUBKEY} " " QuietUninstallString " '"$InstDir\Uninst.exe" /S'
2020-07-31 22:40:03 +00:00
WriteRegDWORD HKCU " ${REGPATH_UNINSTSUBKEY} " " NoModify " 1
WriteRegDWORD HKCU " ${REGPATH_UNINSTSUBKEY} " " NoRepair " 1
2020-08-29 17:20:05 +00:00
! tempfile APP
! makensis '-v2 "-DOUTFILE=${APP}" "-DNAME=NSISPerUserAppExample" -DCOMPANY=Nullsoft "AppGen.nsi"' = 0
File " /oname=$InstDir\MyApp.exe " " ${APP} " ; Pretend that we have a real application to install
! delfile " ${APP} "
2020-07-31 22:40:03 +00:00
SectionEnd
Section " Start Menu shortcut "
CreateShortcut /NoWorkingDir " $SMPrograms \${NAME}.lnk " " $InstDir \MyApp.exe "
SectionEnd
/ *
This Section registers a fictional .test- nullsoft file extension and the Nullsoft.Test ProgId.
Proprietary file types are encouraged ( by Microsoft) to use long file extensions and ProgIds that include the company name .
When registering with " Open With " your executable should ideally have a somewhat unique name ,
otherwise there could be a naming collision with a different application ( with the same name ) installed on the same machine.
REGISTER_DEFAULTPROGRAMS is not defined because proprietary file types do not typically use the Default Programs functionality.
If your application registers a standard file type such as .mp3 or .html or a protocol like HTTP it should register as a Default Program.
It should also register as a client ( https : / /docs .microsoft.com/en - us/windows /win32 /shell /reg - middleware- apps#common-registration-elements-for-all-client-types).
* /
!define ASSOC_EXT " .test-nullsoft "
!define ASSOC_PROGID " Nullsoft.Test "
!define ASSOC_VERB " MyApp "
!define ASSOC_APPEXE " MyApp.exe "
Section - ShellAssoc
# Register file type
WriteRegStr ShCtx " Software\Classes\${ASSOC_PROGID}\DefaultIcon " " " " $InstDir \${ASSOC_APPEXE},0 "
;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "" "Nullsoft Test App" [Optional]
;WriteRegStr ShCtx "Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}" "MUIVerb" "@$InstDir\${ASSOC_APPEXE},-42" ; WinXP+ [Optional] Localizable verb display name
WriteRegStr ShCtx " Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB}\command " " " '"$InstDir\${ASSOC_APPEXE}" "%1"'
WriteRegStr ShCtx " Software\Classes\${ASSOC_EXT} " " " " ${ASSOC_PROGID} "
# Register "Open With" [Optional]
WriteRegNone ShCtx " Software\Classes\${ASSOC_EXT}\OpenWithList " " ${ASSOC_APPEXE} " ; Win2000+ [Optional]
;WriteRegNone ShCtx "Software\Classes\${ASSOC_EXT}\OpenWithProgids" "${ASSOC_PROGID}" ; WinXP+ [Optional]
WriteRegStr ShCtx " Software\Classes\Applications\${ASSOC_APPEXE}\shell\open\command " " " '"$InstDir\${ASSOC_APPEXE}" "%1"'
WriteRegStr ShCtx " Software\Classes\Applications\${ASSOC_APPEXE} " " FriendlyAppName " " Nullsoft Test App " ; [Optional]
WriteRegStr ShCtx " Software\Classes\Applications\${ASSOC_APPEXE} " " ApplicationCompany " " Nullsoft " ; [Optional]
WriteRegNone ShCtx " Software\Classes\Applications\${ASSOC_APPEXE}\SupportedTypes " " ${ASSOC_EXT} " ; [Optional] Only allow "Open With" with specific extension(s) on WinXP+
# Register "Default Programs" [Optional]
!ifdef REGISTER_DEFAULTPROGRAMS
WriteRegStr ShCtx " Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities " " ApplicationDescription " " Shell association example test application "
WriteRegStr ShCtx " Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities\FileAssociations " " ${ASSOC_EXT} " " ${ASSOC_PROGID} "
WriteRegStr ShCtx " Software\RegisteredApplications " " Nullsoft Test App " " Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities "
!endif
${NotifyShell_AssocChanged}
SectionEnd
Section - un.ShellAssoc
# Unregister file type
ClearErrors
DeleteRegKey ShCtx " Software\Classes\${ASSOC_PROGID}\shell\${ASSOC_VERB} "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_PROGID}\shell "
${IfNot} ${Errors}
DeleteRegKey ShCtx " Software\Classes\${ASSOC_PROGID}\DefaultIcon "
${EndIf}
ReadRegStr $0 ShCtx " Software\Classes\${ASSOC_EXT} " " "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_PROGID} "
${IfNot} ${Errors}
${AndIf} $0 == " ${ASSOC_PROGID} "
DeleteRegValue ShCtx " Software\Classes\${ASSOC_EXT} " " "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_EXT} "
${EndIf}
# Unregister "Open With"
DeleteRegKey ShCtx " Software\Classes\Applications\${ASSOC_APPEXE} "
DeleteRegValue ShCtx " Software\Classes\${ASSOC_EXT}\OpenWithList " " ${ASSOC_APPEXE} "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_EXT}\OpenWithList "
DeleteRegValue ShCtx " Software\Classes\${ASSOC_EXT}\OpenWithProgids " " ${ASSOC_PROGID} "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_EXT}\OpenWithProgids "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\${ASSOC_EXT} "
# Unregister "Default Programs"
!ifdef REGISTER_DEFAULTPROGRAMS
DeleteRegValue ShCtx " Software\RegisteredApplications " " Nullsoft Test App "
DeleteRegKey ShCtx " Software\Classes\Applications\${ASSOC_APPEXE}\Capabilities "
DeleteRegKey /IfEmpty ShCtx " Software\Classes\Applications\${ASSOC_APPEXE} "
!endif
# Attempt to clean up junk left behind by the Windows shell
DeleteRegValue HKCU " Software\Microsoft\Windows\CurrentVersion\Search\JumplistData " " $InstDir \${ASSOC_APPEXE} "
DeleteRegValue HKCU " Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache " " $InstDir \${ASSOC_APPEXE}.FriendlyAppName "
DeleteRegValue HKCU " Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache " " $InstDir \${ASSOC_APPEXE}.ApplicationCompany "
DeleteRegValue HKCU " Software\Microsoft\Windows\ShellNoRoam\MUICache " " $InstDir \${ASSOC_APPEXE} " ; WinXP
DeleteRegValue HKCU " Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Compatibility Assistant\Store " " $InstDir \${ASSOC_APPEXE} "
DeleteRegValue HKCU " Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts " " ${ASSOC_PROGID}_${ASSOC_EXT} "
DeleteRegValue HKCU " Software\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts " " Applications\${ASSOC_APPEXE}_${ASSOC_EXT} "
DeleteRegValue HKCU " Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids " " ${ASSOC_PROGID} "
DeleteRegKey /IfEmpty HKCU " Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithProgids "
DeleteRegKey /IfEmpty HKCU " Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT}\OpenWithList "
DeleteRegKey /IfEmpty HKCU " Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${ASSOC_EXT} "
;DeleteRegKey HKCU "Software\Microsoft\Windows\Roaming\OpenWith\FileExts\${ASSOC_EXT}"
;DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs\${ASSOC_EXT}"
${NotifyShell_AssocChanged}
SectionEnd
2021-02-16 13:47:25 +00:00
!macro DeleteFileOrAskAbort path
ClearErrors
Delete " ${path} "
IfErrors 0 + 3
MessageBox MB_ABORTRETRYIGNORE | MB_ICONSTOP 'Unable to delete "${path}"!' IDRETRY - 3 IDIGNORE + 2
Abort " Aborted "
!macroend
2020-07-31 22:40:03 +00:00
2021-02-16 13:47:25 +00:00
Section - Uninstall
!insertmacro DeleteFileOrAskAbort " $InstDir \MyApp.exe "
2020-07-31 22:40:03 +00:00
Delete " $InstDir \Uninst.exe "
RMDir " $InstDir "
DeleteRegKey HKCU " ${REGPATH_UNINSTSUBKEY} "
2021-02-16 13:47:25 +00:00
${UnpinShortcut} " $SMPrograms \${NAME}.lnk "
Delete " $SMPrograms \${NAME}.lnk "
2020-07-31 22:40:03 +00:00
SectionEnd