; fileassoc.nsh; File association helper macros; Written by Saivert;; 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 classReadRegStr $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 classReadRegStr $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" +2WriteRegStr 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 COMMANDWriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`WriteRegStr SHELL_CONTEXT "Software\Classes\${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`!macroend!macro APP_ASSOCIATE_REMOVEVERB FILECLASS VERBDeleteRegKey SHELL_CONTEXT `Software\Classes\${FILECLASS}\shell\${VERB}`!macroend!macro APP_UNASSOCIATE EXT FILECLASS; Backup the previously associated file classReadRegStr $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 EXTReadRegStr ${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