kotkovets, добрый день.
Пытаюсь разобраться в вопросе определения ключей реестра
Нашел в справке вот что:
${If} ${KeyExists} "${HKCU}\Software\7-zip"
# здесь выполняются команды, если ключ существует
DetailPrint "Ключ есть!"
${Else}
# здесь выполняются команды, если ключа не существует
DetailPrint "Ключа не существует!"
${EndIf}
Но это не вовсем то, что требуется.
Пытаюсь сделать обновленный более гибкий макрос файловых ассоциаций
Алгоритм нужен такой:
1. Если существует ключ;
2. И если не присвоено значение по умолчанию;
3. Или значение имеет нулевую длину
- то переход бо безусловной метке.
Иначе выполняются комманды бэкапа и перезаписи асооциаций.
У самого получилось пока вот что:
Код:
!macro RegisterExtension extenstion
Push $1
Push $2
;
StrCpy $ClassName "Winamp.File.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" "" ; Читаем сначала в HKCU
StrCmp "$1" "" NoAssocHKCU ;если значение по умолчанию не присвоено не пишем ассоциацию в HKCU
StrCmp "$1" "$ClassName" NoBackupHKCU ;если совпадает тип файла не бэкапим
WriteRegStr HKCU "Software\Classes\.${extenstion}" "Winamp_Back" "$1" ;иначе бэкапим
NoBackupHKCU:
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName" ;пишем ассоциацию
NoAssocHKCU:
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" "" ; заново читаем значение в HKCU
StrCmp "$1" "$ClassName" NoAssocHKLM ;если применена ассоциация в HKCU пропускаем переход в HKLM
;
DeleteRegValue HKCU "Software\Classes\.${extenstion}" "" ; удаляем значение пустого ключа в HKCU на случай нулевой длины (бывает например в ключах созданных AIMP)
;
ReadRegStr $2 HKLM "SOFTWARE\Classes\.${extenstion}" "" ;читаем значение в HKLM
StrCmp "$2" "" NoBackupHKLM ;если нет значения по умолчанию не бэкапим
StrCmp "$2" "$ClassName" NoBackupHKLM ;если тип совпадает - не бэкапим
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "Winamp_Back" "$2" ;иначе бэкапим
NoBackupHKLM:
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName" ;пишем ассоциацию
NoAssocHKLM:
Pop $1
Pop $2
!macroend
Тут смысл повторить логику внесения асооциаций оригинального Winamp. Если есть значение по умолчанию в HKCU , то ассоциация пишется и бэкапится в HKCU, если ассоциация в HKCU не прописана, то вносится и бэкапится в HKLM. В принципе так и должно быть в нормальной программе.