Показать полную графическую версию : [архив].: NSIS - все вопросы :.
wolkow70
24-04-2012, 12:53
wolkow70, сколько раз говорил, код в тег заключать(выделяем код, жмем кнопочку #), противно читать... »
Да знаю я, мне в тегах неудобно читать.
${If} $8 == ""
${OrIf} $8 == "$ClassName"
${OrIf} $8 == "Applications\AIMP3.exe"
${Else}
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$8"
В том и дело, что тут, наоборот, при восстановлении ассоциаций, параметр реестра должен прописываться, если $8 не равна:
1. "" - пустому значению
2. значению "$ClassName" (текущему значению)
3. значению "Applications\AIMP3.exe" (назначению приложения)
Поэтому и разделил ${Else}. Может как-то по другому можно сформулировать?
kotkovets
24-04-2012, 13:17
В том и дело, что тут, наоборот, при восстановлении ассоциаций, параметр реестра должен прописываться, если $8 не равна: »
${Select} $8
${Case3} "" "$ClassName" "Applications\AIMP3.exe"
${CaseElse}
MessageBox MB_OK "$8" IDOK
${EndSelect}
Вот это согласно поставленному условию
wolkow70
24-04-2012, 13:41
Из справки:
Здесь макрос ${Case} может срабатывать до пяти значений переменной $0
Имеется в виду в один ${Case} можно включать до пяти значений?
Самих ${Case} может быть множество?
Почему в примере присвоено 3 ${Case3} - потому, что три значения, или любую нумерацию можно поставить?
Обладает ли такая формула преимуществами перед тем, что я написал?
kotkovets
24-04-2012, 13:56
Здесь макрос ${Case} может срабатывать до пяти значений переменной $0
Имеется в виду в один ${Case} можно включать до пяти значений? »
до 5 идин Case, правкой хедера можно и больше.. а можно и так:
----
${Case3} "" "$ClassName" "Applications\AIMP3.exe"
${Case5} "1" "---" "test" "nsis" "yyy"
----
Почему в примере присвоено 3 ${Case3} - потому, что три значения, или любую нумерацию можно поставить? »
потому что, 3 значения одной переменной сравниваются.
Обладает ли такая формула преимуществами перед тем, что я написал? »
в каждой из поставленной задач, подбирается путем проб оптимальное и простое решение,
данный макрос удобнее применять, когда сравнивается множество значений одной выбранной переменной.
wolkow70
24-04-2012, 14:33
kotkovets,
При совместном применении в макросе ${Select} и ${Switch} ${extenstion} скрипт не компилируется.
!macro RegisterExtension extenstion
Push $1
Push $2
StrCpy $ClassName "AIMP.${extenstion}"
;
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
${Select} $1
${Case2} "" "$ClassName"
${CaseElse}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "AIMP.Backup" "$1"
${EndSelect}
;
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
WriteRegStr HKCU "Software\Classes\$ClassName\shell\open\command" "" "$OpenCommand"
WriteRegStr HKCU "Software\Classes\$ClassName\shell\open\DropTarget" "CLSID" "{0041494D-5033-4472-6F70-546172676574}"
WriteRegStr HKCU "Software\Classes\$ClassName\CLSID" "" "{0041494D-5033-4472-6F70-546172676574}"
;
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Progid"
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}" "Application"
WriteRegBin HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\OpenWithProgids" "$ClassName" ""
;
${If} ${AtLeastWinVista}
ReadRegStr $2 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
${Select} $2
${Case2} "" "$ClassName"
${CaseElse}
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "AIMP.Backup" "$2"
${EndIf}
;
${Switch} ${extenstion}
${Case} "AAC"
StrCpy $IconIndex 0
WriteRegStr HKCU "Software\Classes\$ClassName" "" "AIMP3: Advanced Audio Codec"
${Break}
${EndSwitch}
WriteRegStr HKCU "Software\Classes\$ClassName\DefaultIcon" "" "$IconFile,$IconIndex"
Pop $2
Pop $1
!macroend
kotkovets
24-04-2012, 15:26
${Select} $2
${Case2} "" "$ClassName"
${CaseElse} »
не закрыт этот макрос перед ${EndIf}, читайте до дыр предыдущее мое сообщение
wolkow70
24-04-2012, 17:26
не закрыт этот макрос »
Подправил. Все работает отлично. Сборку обновил.
wolkow70
25-04-2012, 16:26
kotkovets,
Использую ваш хедер "RegistryFunc.nsh" , но не могу в нем найти функцию определения пустого ключа.
Станадартная функция из справки
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"
несколько раз подводила.
Еще вот нашел такое:
ClearErrors
EnumRegValue $R0 HKLM "${RegistryKey}" 0
IfErrors +1 +2
DetailPrint "(Registry Key Error: ${RegistryKey})" ; Put your error handling here.
StrCmp $R0 "" +1 +3
DeleteRegKey HKLM "${RegistryKey}" ; This will delete the key if there are no more values...
DetailPrint "Removing Registry Key: ${RegistryKey}"
;;Continue your stuff here.
Подскажите как лучше реализовать проверку ключа, и если он пуст, то удалить.
Интересует и возможная логическая конструкция для такого случая.
Пока сам сделал так, но думаю не идеальный вариант...
ReadRegStr $6 HKCU "Software\Classes\.${extenstion}" ""
${If} $6 == ""
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
${EndIf}
kotkovets
25-04-2012, 19:42
Пока сам сделал так, но думаю не идеальный вариант... »
это бред, удалять пустой параметр ключа по умолчанию, здесь удаление ключа раздела(подраздела),
если он пуст и нет параметров.
Если прочитать данные невозможно, то в переменную user_var будет записано пустое значение - будет установлен флаг ошибки.
то можно и так, для ключа по умолчанию, если он пуст:
ClearErrors
ReadRegStr $6 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
MessageBox MB_OK "ключ пуст"
${Else}
MessageBox MB_OK "$6"
${EndIf}
wolkow70
26-04-2012, 12:46
kotkovets,
Я так понимаю, что такая конструкция проверит и удалит ключ если он не содержит вообще никаких параметров.
${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
ClearErrors
EnumRegValue $3 HKCU "Software\Classes\.${extenstion}" 0
IfErrors +1 +2
DetailPrint "Ключ не содержит параметров: HKCU Software\Classes\.${extenstion}"
StrCmp $3 "" +1 +3
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
DetailPrint "Удаление пустого ключа реестра: HKCU Software\Classes\.${extenstion}"
${EndIf}
http://nsis.sourceforge.net/How_to_delete_a_registry_key_only_if_it_has_no_values
А такая конструкция удалит ключ, если нет параметра по умолчанию
ClearErrors
ReadRegStr $3 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
DeleteRegKey HKCU "Software\Classes\.${extenstion}" ""
${EndIf}
Или я чего-то не понял?
добрый день!
Почему может не срабатывает условие
!define DISPLAY_NAME "COOL"
ReadRegStr $0 HKCU "Software\Microsoft\" "var"
!if $0 == ${DISPLAY_NAME}
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
Quit
!endif
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "It'S $0 ${DISPLAY_NAME}"
Заноситься строка и считывается нормально, визуально условие должно сработать так как они равны
kotkovets
26-04-2012, 16:12
dix75,
!if !endif - это команды времени компиляции, а не выполнения программы.
Сранивать эначения можно и нужно так:
!include "MUI2.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
ShowInstDetails show
OutFile "setup.exe"
!define DISPLAY_NAME "COOL"
Section
ReadRegStr $0 HKCU "Software\Microsoft\" "var"
${If} $0 == ${DISPLAY_NAME}
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
Quit
${EndIf}
SectionEnd
или так:
StrCmp $0 ${DISPLAY_NAME} 0 +3
MessageBox MB_OK|MB_ICONQUESTION|MB_TOPMOST "IS... $0"
Quit
Спасибо.
А как можно переименовать ветку реестра?
wolkow70
26-04-2012, 17:00
Так и не соображу как более рациональнее сделать.
Нужно соблюдение условий:
${If}
1. Если ключ реестра HKCU "Software\Classes\.${extenstion}" существует
(как то так: ${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}")
2. И имеет присвоенное значение по умолчанию (задана ассоциация)
ReadRegStr $1 HKCU "Software\Classes\.${extenstion}" ""
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
WriteRegStr HKCU "Software\Classes\.${extenstion}" "DaumLiveBackup.bak" "$1"
(перезапись ассоциации в HKCU "Software\Classes\.${extenstion}")
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
(запись ассоциации в HKLM "Software\Classes\.${extenstion}"
${EndIf}
dix75, в шапке темы прочитайте
ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества. »
Качаем справочник и изучаем
wolkow70
27-04-2012, 14:34
Так и не соображу как более рациональнее сделать. »
Да так и сделал (упрощенно):
ReadRegStr $4 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${Else}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
${EndIf}
А можно перестраховаться и сделать так:
${If} ${KeyExists} "${HKCU}\Software\Classes\.${extenstion}"
ClearErrors
ReadRegStr $4 HKCU "Software\Classes\.${extenstion}" ""
${If} ${Errors}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${Else}
WriteRegStr HKCU "Software\Classes\.${extenstion}" "" "$ClassName"
${EndIf}
${Else}
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
${EndIf}
Что здесь не так
${StrRep} $folder $folder "/" "\"
!insertmacro: macro "FUNCTION_STRING_StrRep" requires 0 parameter(s), passed 4!
Решено. Спасибо
Подскажите как экранировать "
Подскажите как экранировать " »
Используйте одинарную кавычку ' (буква Э на английской раскладке)
Либо знак ` (буква Ё)
Например:
' "Двойные кавычки" '
или
` "Двойные кавычки" 'Одинарные кавычки' `
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC