123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- /*
- 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.
- */
- !define NAME "Per-user example"
- !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
- 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"'
- WriteRegStr HKCU "${REGPATH_UNINSTSUBKEY}" "QuietUninstallString" '"$InstDir\Uninst.exe" /S'
- WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoModify" 1
- WriteRegDWORD HKCU "${REGPATH_UNINSTSUBKEY}" "NoRepair" 1
- !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}"
- 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
- !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
- Section -Uninstall
- !insertmacro DeleteFileOrAskAbort "$InstDir\MyApp.exe"
- Delete "$InstDir\Uninst.exe"
- RMDir "$InstDir"
- DeleteRegKey HKCU "${REGPATH_UNINSTSUBKEY}"
- ${UnpinShortcut} "$SMPrograms\${NAME}.lnk"
- Delete "$SMPrograms\${NAME}.lnk"
- SectionEnd
|