File Association: Difference between revisions
From NSIS Wiki
Jump to navigationJump to search
Themikehall (talk | contribs) m (Double-quotes were needed around the executable, otherwise errors occur like: C:\PROGRA~1\BLAH~1\) |
(used the same schema like wordfunc and filefunc now, usable in uninstaller, save/restore temp variables) |
||
| Line 1: | Line 1: | ||
{{PageAuthor|Vytautas}} | {{PageAuthor|Vytautas}} | ||
{{PageAuthor|intersol}} | {{PageAuthor|intersol}} | ||
{{PageAuthor|chefkoch}} | |||
== Description == | == Description == | ||
Macro for registering and unregistering file extensions in NSIS scripts. | Macro for registering and unregistering file extensions in NSIS scripts. | ||
Can easily be used in installer AND uninstaller sections and functions. | |||
Won't overwrite any variables like $0 $1 ..... and $R0 $R1....... . | |||
== Usage == | == Usage == | ||
| Line 13: | Line 17: | ||
${unregisterExtension} ".mkv" "MKV File" | ${unregisterExtension} ".mkv" "MKV File" | ||
</highlight-nsis> | </highlight-nsis> | ||
== | == FileAssociation.nsh == | ||
<highlight-nsis> | <highlight-nsis> | ||
! | _____________________________________________________________________________ | ||
File Association | |||
_____________________________________________________________________________ | |||
Based on code taken from http://nsis.sourceforge.net/File_Association | |||
Usage in script: | |||
1. !include "FileFunc.nsh" | |||
2. [Section|Function] | |||
${FileAssociationFunction} "Param1" "Param2" "..." $var | |||
[SectionEnd|FunctionEnd] | |||
FileAssociationFunction=[RegisterExtension|UnRegisterExtension] | |||
_____________________________________________________________________________ | |||
${RegisterExtension} "[executable]" "[extension]" "[description]" | |||
"[executable]" ; executable which opens the file format | |||
; | |||
"[extension]" ; extension, which represents the file format to open | |||
; | |||
"[description]" ; description for the extension. This will be display in Windows Explorer. | |||
; | |||
${UnRegisterExtension} "[extension]" "[description]" | |||
"[extension]" ; extension, which represents the file format to open | |||
; | |||
"[description]" ; description for the extension. This will be display in Windows Explorer. | |||
; | |||
_____________________________________________________________________________ | |||
Macros | |||
_____________________________________________________________________________ | |||
Change log window verbosity (default: 3=no script) | |||
Example: | |||
!include "FileAssociation.nsh" | |||
!insertmacro RegisterExtension | |||
${FileAssociation_VERBOSE} 4 # all verbosity | |||
!insertmacro UnRegisterExtension | |||
${FileAssociation_VERBOSE} 3 # no script | |||
*/ | |||
!ifndef FileAssociation_INCLUDED | |||
!define FileAssociation_INCLUDED | |||
!include Util.nsh | |||
!verbose push | |||
!verbose 3 | |||
!ifndef _FileAssociation_VERBOSE | |||
!define _FileAssociation_VERBOSE 3 | |||
!endif | |||
!verbose ${_FileAssociation_VERBOSE} | |||
!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE` | |||
!verbose pop | |||
!macro FileAssociation_VERBOSE _VERBOSE | |||
!verbose push | |||
!verbose 3 | |||
!undef _FileAssociation_VERBOSE | |||
!define _FileAssociation_VERBOSE ${_VERBOSE} | |||
!verbose pop | |||
!macroend | !macroend | ||
; | |||
!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION | |||
!verbose push | |||
!verbose ${_FileAssociation_VERBOSE} | |||
Push `${_EXECUTABLE}` | |||
Push `${_EXTENSION}` | |||
Push `${_DESCRIPTION}` | |||
${CallArtificialFunction} RegisterExtension_ | |||
!verbose pop | |||
!macroend | |||
!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION | |||
!verbose push | |||
!verbose ${_FileAssociation_VERBOSE} | |||
Push `${_EXTENSION}` | |||
Push `${_DESCRIPTION}` | |||
${CallArtificialFunction} UnRegisterExtension_ | |||
!verbose pop | |||
!macroend | |||
!define RegisterExtension `!insertmacro RegisterExtensionCall` | |||
!define un.RegisterExtension `!insertmacro RegisterExtensionCall` | |||
!macro RegisterExtension | |||
!macroend | |||
!macro un.RegisterExtension | |||
!macroend | |||
!macro RegisterExtension_ | |||
!verbose push | |||
!verbose ${_FileAssociation_VERBOSE} | |||
Exch $R2 ;desc | |||
Exch | |||
Exch $R1 ;ext | |||
Exch | |||
Exch 2 | |||
Exch $R0 ;exe | |||
Exch 2 | |||
Push $0 | |||
Push $1 | |||
!define Index "Line${__LINE__}" | !define Index "Line${__LINE__}" | ||
ReadRegStr $1 HKCR $R1 "" | ReadRegStr $1 HKCR $R1 "" | ||
StrCmp $1 "" "${Index}-NoBackup" | StrCmp $1 "" "${Index}-NoBackup" | ||
StrCmp $1 "OptionsFile" "${Index}-NoBackup" | StrCmp $1 "OptionsFile" "${Index}-NoBackup" | ||
WriteRegStr HKCR $R1 "backup_val" $1 | WriteRegStr HKCR $R1 "backup_val" $1 | ||
"${Index}-NoBackup:" | "${Index}-NoBackup:" | ||
WriteRegStr HKCR $R1 "" $R0 | WriteRegStr HKCR $R1 "" $R0 | ||
ReadRegStr $0 HKCR $R0 "" | ReadRegStr $0 HKCR $R0 "" | ||
StrCmp $0 "" 0 "${Index}-Skip" | StrCmp $0 "" 0 "${Index}-Skip" | ||
WriteRegStr HKCR $R0 "" $R0 | |||
WriteRegStr HKCR "$R0\shell" "" "open" | |||
WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0" | |||
"${Index}-Skip:" | "${Index}-Skip:" | ||
WriteRegStr HKCR "$R0\shell\open\command" "" ' | WriteRegStr HKCR "$R0\shell\open\command" "" '$R2 "%1"' | ||
WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" | WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0" | ||
WriteRegStr HKCR "$R0\shell\edit\command" "" ' | WriteRegStr HKCR "$R0\shell\edit\command" "" '$R2 "%1"' | ||
!undef Index | !undef Index | ||
Pop $1 | |||
Pop $0 | |||
Pop $R2 | |||
Pop $R1 | |||
Pop $R0 | |||
!verbose pop | |||
!macroend | |||
!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall` | |||
!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall` | |||
!macro UnRegisterExtension | |||
!macroend | !macroend | ||
!macro un.UnRegisterExtension | |||
!macroend | |||
!macro UnRegisterExtension_ | |||
!verbose push | |||
!verbose ${_FileAssociation_VERBOSE} | |||
Exch $R1 ;desc | |||
Exch | |||
Exch $R0 ;ext | |||
Exch | |||
Push $0 | |||
Push $1 | |||
!define Index "Line${__LINE__}" | !define Index "Line${__LINE__}" | ||
ReadRegStr $1 HKCR $R0 "" | ReadRegStr $1 HKCR $R0 "" | ||
| Line 72: | Line 197: | ||
DeleteRegKey HKCR $R0 | DeleteRegKey HKCR $R0 | ||
Goto "${Index}-NoOwn" | Goto "${Index}-NoOwn" | ||
"${Index}-Restore:" | "${Index}-Restore:" | ||
WriteRegStr HKCR $R0 "" $1 | WriteRegStr HKCR $R0 "" $1 | ||
DeleteRegValue HKCR $R0 "backup_val" | DeleteRegValue HKCR $R0 "backup_val" | ||
DeleteRegKey HKCR $R1 ;Delete key with association name settings | DeleteRegKey HKCR $R1 ;Delete key with association name settings | ||
"${Index}-NoOwn:" | "${Index}-NoOwn:" | ||
!undef Index | !undef Index | ||
Pop $1 | |||
Pop $0 | |||
Pop $R1 | |||
Pop $R0 | |||
!verbose pop | |||
!macroend | |||
!endif # !FileAssociation_INCLUDED | |||
</highlight-nsis> | </highlight-nsis> | ||
Revision as of 10:00, 12 April 2009
| Author: Vytautas (talk, contrib) |
| Author: intersol (talk, contrib) |
| Author: chefkoch (talk, contrib) |
Description
Macro for registering and unregistering file extensions in NSIS scripts.
Can easily be used in installer AND uninstaller sections and functions. Won't overwrite any variables like $0 $1 ..... and $R0 $R1....... .
Usage
!include "registerExtension.nsh" ... # later, inside a section: ${registerExtension} "c:\myplayer.exe" ".mkv" "MKV File" ${unregisterExtension} ".mkv" "MKV File"
FileAssociation.nsh
_____________________________________________________________________________
File Association
_____________________________________________________________________________
Based on code taken from http://nsis.sourceforge.net/File_Association
Usage in script:
1. !include "FileFunc.nsh"
2. [Section|Function]
${FileAssociationFunction} "Param1" "Param2" "..." $var
[SectionEnd|FunctionEnd]
FileAssociationFunction=[RegisterExtension|UnRegisterExtension]
_____________________________________________________________________________
${RegisterExtension} "[executable]" "[extension]" "[description]"
"[executable]" ; executable which opens the file format
;
"[extension]" ; extension, which represents the file format to open
;
"[description]" ; description for the extension. This will be display in Windows Explorer.
;
${UnRegisterExtension} "[extension]" "[description]"
"[extension]" ; extension, which represents the file format to open
;
"[description]" ; description for the extension. This will be display in Windows Explorer.
;
_____________________________________________________________________________
Macros
_____________________________________________________________________________
Change log window verbosity (default: 3=no script)
Example:
!include "FileAssociation.nsh"
!insertmacro RegisterExtension
${FileAssociation_VERBOSE} 4 # all verbosity
!insertmacro UnRegisterExtension
${FileAssociation_VERBOSE} 3 # no script
*/
!ifndef FileAssociation_INCLUDED
!define FileAssociation_INCLUDED
!include Util.nsh
!verbose push
!verbose 3
!ifndef _FileAssociation_VERBOSE
!define _FileAssociation_VERBOSE 3
!endif
!verbose ${_FileAssociation_VERBOSE}
!define FileAssociation_VERBOSE `!insertmacro FileAssociation_VERBOSE`
!verbose pop
!macro FileAssociation_VERBOSE _VERBOSE
!verbose push
!verbose 3
!undef _FileAssociation_VERBOSE
!define _FileAssociation_VERBOSE ${_VERBOSE}
!verbose pop
!macroend
!macro RegisterExtensionCall _EXECUTABLE _EXTENSION _DESCRIPTION
!verbose push
!verbose ${_FileAssociation_VERBOSE}
Push `${_EXECUTABLE}`
Push `${_EXTENSION}`
Push `${_DESCRIPTION}`
${CallArtificialFunction} RegisterExtension_
!verbose pop
!macroend
!macro UnRegisterExtensionCall _EXTENSION _DESCRIPTION
!verbose push
!verbose ${_FileAssociation_VERBOSE}
Push `${_EXTENSION}`
Push `${_DESCRIPTION}`
${CallArtificialFunction} UnRegisterExtension_
!verbose pop
!macroend
!define RegisterExtension `!insertmacro RegisterExtensionCall`
!define un.RegisterExtension `!insertmacro RegisterExtensionCall`
!macro RegisterExtension
!macroend
!macro un.RegisterExtension
!macroend
!macro RegisterExtension_
!verbose push
!verbose ${_FileAssociation_VERBOSE}
Exch $R2 ;desc
Exch
Exch $R1 ;ext
Exch
Exch 2
Exch $R0 ;exe
Exch 2
Push $0
Push $1
!define Index "Line${__LINE__}"
ReadRegStr $1 HKCR $R1 ""
StrCmp $1 "" "${Index}-NoBackup"
StrCmp $1 "OptionsFile" "${Index}-NoBackup"
WriteRegStr HKCR $R1 "backup_val" $1
"${Index}-NoBackup:"
WriteRegStr HKCR $R1 "" $R0
ReadRegStr $0 HKCR $R0 ""
StrCmp $0 "" 0 "${Index}-Skip"
WriteRegStr HKCR $R0 "" $R0
WriteRegStr HKCR "$R0\shell" "" "open"
WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
"${Index}-Skip:"
WriteRegStr HKCR "$R0\shell\open\command" "" '$R2 "%1"'
WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
WriteRegStr HKCR "$R0\shell\edit\command" "" '$R2 "%1"'
!undef Index
Pop $1
Pop $0
Pop $R2
Pop $R1
Pop $R0
!verbose pop
!macroend
!define UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
!define un.UnRegisterExtension `!insertmacro UnRegisterExtensionCall`
!macro UnRegisterExtension
!macroend
!macro un.UnRegisterExtension
!macroend
!macro UnRegisterExtension_
!verbose push
!verbose ${_FileAssociation_VERBOSE}
Exch $R1 ;desc
Exch
Exch $R0 ;ext
Exch
Push $0
Push $1
!define Index "Line${__LINE__}"
ReadRegStr $1 HKCR $R0 ""
StrCmp $1 $R1 0 "${Index}-NoOwn" ; only do this if we own it
ReadRegStr $1 HKCR $R0 "backup_val"
StrCmp $1 "" 0 "${Index}-Restore" ; if backup="" then delete the whole key
DeleteRegKey HKCR $R0
Goto "${Index}-NoOwn"
"${Index}-Restore:"
WriteRegStr HKCR $R0 "" $1
DeleteRegValue HKCR $R0 "backup_val"
DeleteRegKey HKCR $R1 ;Delete key with association name settings
"${Index}-NoOwn:"
!undef Index
Pop $1
Pop $0
Pop $R1
Pop $R0
!verbose pop
!macroend
!endif # !FileAssociation_INCLUDED
Info
Any refereces to execute.exe should be replaced with the appropriate command to perform the specified action.
This page was based on information provided in "Examples\makensis.nsi" and this thread: http://forums.winamp.com/showthread.php?s=&threadid=140254
Vytautas