1; Cf. http://nsis.sourceforge.net/File_Association
2; I commented out the 'edit' association which is confusing
3
4!define registerExtension "!insertmacro registerExtension"
5!define unregisterExtension "!insertmacro unregisterExtension"
6
7!macro registerExtension executable extension description
8       Push "${executable}"  ; "full path to my.exe"
9       Push "${extension}"   ;  ".mkv"
10       Push "${description}" ;  "MKV File"
11       Call registerExtension
12!macroend
13
14; back up old value of .opt
15Function registerExtension
16!define Index "Line${__LINE__}"
17  pop $R0 ; ext name
18  pop $R1
19  pop $R2
20  push $1
21  push $0
22  ReadRegStr $1 HKCR $R1 ""
23  StrCmp $1 "" "${Index}-NoBackup"
24    StrCmp $1 "OptionsFile" "${Index}-NoBackup"
25    WriteRegStr HKCR $R1 "backup_val" $1
26"${Index}-NoBackup:"
27  WriteRegStr HKCR $R1 "" $R0
28  ReadRegStr $0 HKCR $R0 ""
29  StrCmp $0 "" 0 "${Index}-Skip"
30	WriteRegStr HKCR $R0 "" $R0
31	WriteRegStr HKCR "$R0\shell" "" "open"
32	WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
33"${Index}-Skip:"
34  WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"'
35;  WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
36;  WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"'
37  pop $0
38  pop $1
39!undef Index
40FunctionEnd
41
42!macro unregisterExtension extension description
43       Push "${extension}"   ;  ".mkv"
44       Push "${description}"   ;  "MKV File"
45       Call un.unregisterExtension
46!macroend
47
48Function un.unregisterExtension
49  pop $R1 ; description
50  pop $R0 ; extension
51!define Index "Line${__LINE__}"
52  ReadRegStr $1 HKCR $R0 ""
53  StrCmp $1 $R1 0 "${Index}-NoOwn" ; only do this if we own it
54  ReadRegStr $1 HKCR $R0 "backup_val"
55  StrCmp $1 "" 0 "${Index}-Restore" ; if backup="" then delete the whole key
56  DeleteRegKey HKCR $R0
57  Goto "${Index}-NoOwn"
58"${Index}-Restore:"
59  WriteRegStr HKCR $R0 "" $1
60  DeleteRegValue HKCR $R0 "backup_val"
61  DeleteRegKey HKCR $R1 ;Delete key with association name settings
62"${Index}-NoOwn:"
63!undef Index
64FunctionEnd
65