PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 [132] 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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}

Или я чего-то не понял?

dix75
26-04-2012, 15:28
добрый день!

Почему может не срабатывает условие
!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

dix75
26-04-2012, 16:37
Спасибо.

А как можно переименовать ветку реестра?

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}

K.A.V.
26-04-2012, 17:32
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}

dix75
28-04-2012, 12:29
Что здесь не так
${StrRep} $folder $folder "/" "\"

!insertmacro: macro "FUNCTION_STRING_StrRep" requires 0 parameter(s), passed 4!
Решено. Спасибо

dix75
28-04-2012, 13:16
Подскажите как экранировать "

K.A.V.
28-04-2012, 13:21
Подскажите как экранировать " »
Используйте одинарную кавычку ' (буква Э на английской раскладке)
Либо знак ` (буква Ё)

Например:
' "Двойные кавычки" '
или
` "Двойные кавычки" 'Одинарные кавычки' `

dix75
28-04-2012, 13:47
Спасиб.




© OSzone.net 2001-2012