123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- ; fileassoc.nsh
- ; File association helper macros
- ; Written by Saivert
- ;
- ; Improved by Nikku<https://github.com/nikku>.
- ;
- ; Features automatic backup system and UPDATEFILEASSOC macro for
- ; shell change notification.
- ;
- ; |> How to use <|
- ; To associate a file with an application so you can double-click it in explorer, use
- ; the APP_ASSOCIATE macro like this:
- ;
- ; Example:
- ; !insertmacro APP_ASSOCIATE "txt" "myapp.textfile" "Description of txt files" \
- ; "$INSTDIR\myapp.exe,0" "Open with myapp" "$INSTDIR\myapp.exe $\"%1$\""
- ;
- ; Never insert the APP_ASSOCIATE macro multiple times, it is only ment
- ; to associate an application with a single file and using the
- ; the "open" verb as default. To add more verbs (actions) to a file
- ; use the APP_ASSOCIATE_ADDVERB macro.
- ;
- ; Example:
- ; !insertmacro APP_ASSOCIATE_ADDVERB "myapp.textfile" "edit" "Edit with myapp" \
- ; "$INSTDIR\myapp.exe /edit $\"%1$\""
- ;
- ; To have access to more options when registering the file association use the
- ; APP_ASSOCIATE_EX macro. Here you can specify the verb and what verb is to be the
- ; standard action (default verb).
- ;
- ; Note, that this script takes into account user versus global installs.
- ; To properly work you must initialize the SHELL_CONTEXT variable via SetShellVarContext.
- ;
- ; And finally: To remove the association from the registry use the APP_UNASSOCIATE
- ; macro. Here is another example just to wrap it up:
- ; !insertmacro APP_UNASSOCIATE "txt" "myapp.textfile"
- ;
- ; |> Note <|
- ; When defining your file class string always use the short form of your application title
- ; then a period (dot) and the type of file. This keeps the file class sort of unique.
- ; Examples:
- ; Winamp.Playlist
- ; NSIS.Script
- ; Photoshop.JPEGFile
- ;
- ; |> Tech info <|
- ; The registry key layout for a global file association is:
- ;
- ; HKEY_LOCAL_MACHINE\Software\Classes
- ; <".ext"> = <applicationID>
- ; <applicationID> = <"description">
- ; shell
- ; <verb> = <"menu-item text">
- ; command = <"command string">
- ;
- ;
- ; The registry key layout for a per-user file association is:
- ;
- ; HKEY_CURRENT_USER\Software\Classes
- ; <".ext"> = <applicationID>
- ; <applicationID> = <"description">
- ; shell
- ; <verb> = <"menu-item text">
- ; command = <"command string">
- ;
- !macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
- ; Backup the previously associated file class
- ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" "open"
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\open\command" "" `${COMMAND}`
- !macroend
- !macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
- ; Backup the previously associated file class
- ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" ""
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0"
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "${FILECLASS}"
- StrCmp "${SHELLNEW}" "0" +2
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}\ShellNew" "NullFile" ""
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}" "" `${DESCRIPTION}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\DefaultIcon" "" `${ICON}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell" "" `${DEFAULTVERB}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
- !macroend
- !macro APP_ASSOCIATE_ADDVERB FILECLASS VERB COMMANDTEXT COMMAND
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
- WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
- !macroend
- !macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERB
- DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}\shell\${VERB}`
- !macroend
- !macro APP_UNASSOCIATE EXT FILECLASS
- ; Backup the previously associated file class
- ReadRegStr $R0 SHELL_CONTEXT "Software\Classes\.${EXT}" `${FILECLASS}_backup`
- WriteRegStr SHELL_CONTEXT "Software\Classes\.${EXT}" "" "$R0"
- DeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}`
- !macroend
- !macro APP_ASSOCIATE_GETFILECLASS OUTPUT EXT
- ReadRegStr ${OUTPUT} SHELL_CONTEXT "Software\Classes\.${EXT}" ""
- !macroend
- ; !defines for use with SHChangeNotify
- !ifdef SHCNE_ASSOCCHANGED
- !undef SHCNE_ASSOCCHANGED
- !endif
- !define SHCNE_ASSOCCHANGED 0x08000000
- !ifdef SHCNF_FLUSH
- !undef SHCNF_FLUSH
- !endif
- !define SHCNF_FLUSH 0x1000
- !macro UPDATEFILEASSOC
- ; Using the system.dll plugin to call the SHChangeNotify Win32 API function so we
- ; can update the shell.
- System::Call "shell32::SHChangeNotify(i,i,i,i) (${SHCNE_ASSOCCHANGED}, ${SHCNF_FLUSH}, 0, 0)"
- !macroend
|