Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
23-06-2011, 16:26
мне сделать регистрацию »
самый простой вариант:
RegDll "путь\ac3filter.ax"
или так:
ExecWait '$SYSDIR\RegSvr32.exe /s "путь\ac3filter.ax"'
Разрегистрация:
UnRegDll "путь\ac3filter.ax"
или так:
ExecWait '$SYSDIR\RegSvr32.exe /s /u "путь\ac3filter.ax"'
начитавшись, я правильно понял, что невозможно "выдрать" скрипт из инсталлятора ?
Не могу разобраться с логикой.
В случае повторной установки (поверх), нужно что бы один файл не переписывался заново и тем более не удалялся, а сохранялся под новым именем.
Что то вроде этого, но не могу понять, как взять именно последнюю цифру
IfFileExists "$INSTDIR\lang\Russian_old.xml" 0 noInt
IfFileExists "$INSTDIR\lang\Russian_old_1.xml" 0 +2
StrCpy $0 Russian_old_1.xml -1 -5
IfFileExists "$INSTDIR\lang\Russian_old_2.xml" 0 +2
StrCpy $0 Russian_old_2.xml -1 -5
; и так далее ......
noInt:
IntOp $0 $0 + 1
CopyFiles /silent "$INSTDIR\lang\Russian_old.xml" "$INSTDIR\lang\Russian_old_$0.xml"
Goto noRuss
IfFileExists "$INSTDIR\lang\Russian.xml" +2
Rename "$INSTDIR\lang\Russian.xml" "$INSTDIR\lang\Russian_old.xml"
noRuss:
--
Если точно знаете, что число будет с одной цифрой, могу предложить самый быстрый и простой вариант
StrCpy $0 "Russian_old_2.xml" "" -5
StrCpy $0 "$0" 1
kotkovets
04-07-2011, 22:12
как взять именно последнюю цифру »
А че ее брать, отсчитываем с конца 5 символов и берем 1 последующий символ
StrCpy $0 Russian_old_1.xml 1 -5
Не могу разобраться с логикой »
IfFileExists "$INSTDIR\lang\Russian_old_1.xml" 0 +2
StrCpy $0 Russian_old_1.xml -1 -5
IfFileExists "$INSTDIR\lang\Russian_old_2.xml" 0 +2
; и так далее ...... »
А не кажется ли вам, что здесь только циклом, судя по последней увеличивающейся цифре? опредилитесь с условием выхода из цикла и посмотрите в сторону логических конструкций - с ними куда проще работать.
При каждой последующей установке, что бы последняя (старшая) цифра увеличивалась на +1
IntOp $0 $0 + 1 ;прибавляет 1
Как определить последнюю 1,2,3,4,5.....9 цифру, пускай будет один разряд.
= $0 > $0
--
kotkovets
05-07-2011, 01:10
Не могу разобраться с логикой.
В случае повторной установки (поверх), нужно что бы один файл не переписывался заново и тем более не удалялся, а сохранялся под новым именем. »
Все достаточно просто, создайте рядом со скриптом Текстовый документ.txt и каждый следующий запуск будет прибавлять единицу к имени файла и так до 1000 - потом "обнулится" до единицы - этого вполне достаточно.
OutFile "setup.exe"
!include "logiclib.nsh"
ShowInstDetails show
Section
#******************************************************************************************
StrLen $2 "Текстовый документ_old_" ;получаем число символов для поиска по маске
StrLen $6 "Текстовый документ_old_1.txt" ;получаем число символов до old_9
StrLen $7 "Текстовый документ_old_100.txt" ;получаем число символов до old_1000
#******************************************************************************************
${If} ${FileExists} "$EXEDIR\Текстовый документ.txt"
Rename "$EXEDIR\Текстовый документ.txt" "$EXEDIR\Текстовый документ_old.txt"
${ElseIf} ${FileExists} "$EXEDIR\Текстовый документ_old.txt"
Rename "$EXEDIR\Текстовый документ_old.txt" "$EXEDIR\Текстовый документ_old_1.txt"
${Else}
FindFirst $0 `$1` "$EXEDIR\*.txt" ;ищем все файлы с расширением txt
${DoUntil} `$1` == `` ;в переменную $1 получаем в цикле имена файлов
StrCpy `$3` `$1` $2 ;берем $2 символов с получаемых имен файлов и результат в $3
${If} `$3` == "Текстовый документ_old_" ;сравниваем результат по маске
StrLen $5 `$1` ;получаем число символов из файла
${IfThen} $5 <= $6 ${|}StrCpy $4 `$1` 1 -5${|} ;если $4 < old_9 берем 1 символ
${IfThen} $5 > $6 ${|}StrCpy $4 `$1` 2 -6${|} ;если $4 > old_9 берем 2 символа
${IfThen} $5 >= $7 ${|}StrCpy $4 `$1` 3 -7${|} ;если $4 > old_99 берем 3 символа
IntOp $4 $4 + 1
Rename "$EXEDIR\$1" "$EXEDIR\$3$4.txt"
DetailPrint "$3$4.txt"
${Break} ; выход из цикла
${EndIf}
FindNext $0 $1
${Loop}
FindClose $0
${EndIf}
SectionEnd
Спасибо, что откликнулись!
kotkovets
Не совсем то, пример работает только с одним файлом, старые не сохраняет, но мысль понятна, остальное сам доведу.
И ещё один вопрос, используя MUI2 - nsDialog, уже в готовом и отлаженом скрипте, что бы его не уродовать, хотелось бы простым способом заглушить CheckBox. Что бы CheckBox был отмечен, и пользователь не мог выбрать действие.
В InstallOptions это легко реализуется установкой флага, в nsDialog это намного сложнее.
kotkovets
05-07-2011, 03:46
И ещё один вопрос, используя MUI2 - nsDialog, уже в готовом и отлаженом скрипте, что бы его не уродовать, хотелось бы простым способом заглушить CheckBox. Что бы CheckBox был отмечен, и пользователь не мог выбрать действие.
В InstallOptions это легко реализуется установкой флага, в nsDialog это намного сложнее. »
ИМХО!!! все очень просто, в переменной $CheckBox - хэндл чебокса, а если есть хэндл делаем все, что хотим....
InstallOptions - устаревшая вещь, nsDialogs намного больше возможностей, а если еще в паре с system.dll, можно делать почти всё - средствами Win API
OutFile "winreview.exe"
ShowInstDetails show
Var Dialog
Var CheckBox
Function fnCustomInit
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateCheckBox} 0 45u 120u 10u "Нельзя отметить флажком"
Pop $CheckBox
${NSD_SetState} $CheckBox 1 ;отмеченный чебокс
EnableWindow $CheckBox 0 ;глушим чебокс
nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
${NSD_GetState} $CheckBox $0
FunctionEnd
Section
StrCmp $0 1 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "чебокс отмеченный" IDOK
SectionEnd
wolkow70
05-07-2011, 11:45
Уважаемый kotkovets, пытаюсь осваивать, что нибудь более сложное, чем скрипт регистрации ассоциаций от AIMP. В справке нашел такие варианты:
1.
!macro APP_ASSOCIATE EXT FILECLASS DESCRIPTION ICON COMMANDTEXT COMMAND
; Backup the previously associated file class
ReadRegStr $R0 HKCR ".${EXT}" ""
WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
WriteRegStr HKCR "${FILECLASS}\shell" "" "open"
WriteRegStr HKCR "${FILECLASS}\shell\open" "" `${COMMANDTEXT}`
WriteRegStr HKCR "${FILECLASS}\shell\open\command" "" `${COMMAND}`
!macroend
2.
!macro APP_ASSOCIATE_EX EXT FILECLASS DESCRIPTION ICON VERB DEFAULTVERB SHELLNEW COMMANDTEXT COMMAND
; Backup the previously associated file class
ReadRegStr $R0 HKCR ".${EXT}" ""
WriteRegStr HKCR ".${EXT}" "${FILECLASS}_backup" "$R0"
WriteRegStr HKCR ".${EXT}" "" "${FILECLASS}"
StrCmp "${SHELLNEW}" "0" +2
WriteRegStr HKCR ".${EXT}\ShellNew" "NullFile" ""
WriteRegStr HKCR "${FILECLASS}" "" `${DESCRIPTION}`
WriteRegStr HKCR "${FILECLASS}\DefaultIcon" "" `${ICON}`
WriteRegStr HKCR "${FILECLASS}\shell" "" `${DEFAULTVERB}`
WriteRegStr HKCR "${FILECLASS}\shell\${VERB}" "" `${COMMANDTEXT}`
WriteRegStr HKCR "${FILECLASS}\shell\${VERB}\command" "" `${COMMAND}`
!macroend
3.
!macro RegisterExtension_
!verbose push
!verbose ${_FileAssociation_VERBOSE}
Exch $R2 ;exe
Exch
Exch $R1 ;ext
Exch
Exch 2
Exch $R0 ;desc
Exch 2
Push $0
Push $1
ReadRegStr $1 HKCR $R1 "" ; read current file association
StrCmp "$1" "" NoBackup ; is it empty
StrCmp "$1" "$R0" NoBackup ; is it our own
WriteRegStr HKCR $R1 "backup_val" "$1" ; backup current value
NoBackup:
WriteRegStr HKCR $R1 "" "$R0" ; set our file association
ReadRegStr $0 HKCR $R0 ""
StrCmp $0 "" 0 Skip
WriteRegStr HKCR "$R0" "" "$R0"
WriteRegStr HKCR "$R0\shell" "" "open"
WriteRegStr HKCR "$R0\DefaultIcon" "" "$R2,0"
Skip:
WriteRegStr HKCR "$R0\shell\open\command" "" '"$R2" "%1"'
WriteRegStr HKCR "$R0\shell\edit" "" "Edit $R0"
WriteRegStr HKCR "$R0\shell\edit\command" "" '"$R2" "%1"'
Pop $1
Pop $0
Pop $R2
Pop $R1
Pop $R0
!verbose pop
!macroend
Не могу разобраться какой лучше, и как его использовать в контексте работы с секциями. Помогите, плиз.
И почему согласно макросам нужно использовать именно HKCR , а не HKLM?
И почему согласно макросам нужно использовать именно HKCR , а не HKLM? »
В поисковике набери REGIST.CHM
На диске Registry хранится не в одном большом, а в нескольких отдельных файлах, называемых «ульями» (hive).
Каждый улей содержит одну древовидную структуру Registry, имеющую свой корневой ключ (т. е. вершину дерева).
HKEY_CLASSES_ROOT Символьная ссылка на ключ HKEY_LOCAL_MACHINE\SOFTWARE\Classes.
HKEY_LOCAL_MACHINE Временный ключ, не имеющий соответствующего физического улья. Объединяет корневые ключи различных ульев
kotkovets
05-07-2011, 17:55
пытаюсь осваивать, что нибудь более сложное, чем скрипт регистрации ассоциаций от AIMP »
Чета я не видел здесь навороченных ассоциаций, чем в скрипте AIMP`а
как его использовать в контексте работы с секциями»
Структура макроса такая:
!macro название [аргумент] [аргумент 1]
;команды в макросе
!macroend
Вызов макроса:
!insertmacro название [аргумент] [аргумент 1]
Навскидку макрос сделал (не проверял):
#!insertmacro AssocExtension "расширение" "класс расширения" "путь к приложению" "индекс иконки"
#!insertmacro AssocExtension "aac" "AIMP.ACC" "$INSTDIR\AIMP2.exe" "$INSTDIR\AIMP2.exe, 1"
!macro AssocExtension EXT FILECLASS PATH_APP ICON
ReadRegStr $R0 HKLM "Software\Classes\.${EXT}" ;читаем текущее значение расширения
StrCmp $R0 "" +2 ;если раширения ${EXT} нету - бэкап не делаем
WriteRegStr HKLM "Software\Classes\.${EXT}" "${FILECLASS}_backup" "$R0" ;делаем бэкап
WriteRegStr HKLM "Software\Classes\.${EXT}" "" "${FILECLASS}"
WriteRegStr HKLM "Software\Classes\${FILECLASS}" "" "${FILECLASS}"
WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell" "" "Play"
WriteRegStr HKLM "Software\Classes\${FILECLASS}\shell\Play\command" "" '"${PATH_APP}" "%1"' ;путь к приложению
WriteRegStr HKLM "Software\Classes\${FILECLASS}\DefaultIcon" "" "${ICON}" ;путь к иконке или к ресурсам содержащие иконки"
!macroend
И почему согласно макросам нужно использовать именно HKCR , а не HKLM? »
Но я же в макросе использовал HKLM ... читайте внимательно
Создание своего инсталлятора на NSIS. Ассоциации файлов. Макросы (http://www.winreview.ru/comment.php?comment.news.266)
wolkow70, Вы когда научитесь использововать теги, скрипт выделяете и жмете #
Больше такое читать больше не буду, пока тегами не научитесь пользоваться
!macro название [аргумент] [аргумент 1]
;команды в макросе
!macroend
»
Для архитектуры x64 в данном примере, следует принудительно переводить в SetRegView 64 или на усмотрение форточки?
--
kotkovets
05-07-2011, 22:32
sawe, редирект тут совершенно не нужен
wolkow70
06-07-2011, 07:46
Но я же в макросе использовал HKLM ... читайте внимательно »
Я имел в ввиду макросы из справки.
Ps. В скрипте AIMP, который выложен тут на форуме тоже HKCR используется.
StrCpy $ClassName "AIMP.${extenstion}"
StrCmp ${extenstion} "AUDIOCD" 0 noaudio
WriteRegStr HKCR "${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\${extenstion}\UserChoice" "Progid" "$ClassName"
noaudio:
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
WriteRegStr HKCR "$ClassName\CLSID" "" "{0041494D-5032-4472-6F70-546172676574}"
WriteRegStr HKCR "$ClassName\shell\open" "" "Открыть в AIMP2"
WriteRegStr HKCR "$ClassName\shell\open\command" "" "$OpenCommand"
WriteRegStr HKCR "$ClassName\shell\open\DropTarget" "CLSID" "{0041494D-5032-4472-6F70-546172676574}"
WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}" "" "AIMP"
WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}\LocalServer32" "" "$Exe_Path"
WriteRegStr HKCR "CLSID\{0041494D-5032-4472-6F70-546172676574}\ProgID" "" "AIMP.TDropTarget"
WriteRegStr HKCR "AIMP.TDropTarget" "" "AIMP"
WriteRegStr HKCR "AIMP.TDropTarget\Clsid" "" "{0041494D-5032-4472-6F70-546172676574}"
Оно бы и ладно, но если использовать инсталлятор на T-13 установки XP, то ассоциации, прописанные в HKCR не срабатывают, а в HKLM работают.
wolkow70
06-07-2011, 14:02
Уважаемый, kotkovets, почитал вашу статью про макрос. Вот, что написано:
целесообразно создавать структуру ассоциаций файлов либо в ветке реестра HKEY_LOCAL_MACHINE\Software\Classes, либо в HKEY_CURRENT_USER\Software\Classes, причем последняя имеет приоритет, и при построении представления HKEY_CLASSES_ROOT будет иметь приоритет над HKEY_LOCAL_MACHINE.
При этом, приходилось, читать в литературе, что внесение записей непосредственно в HKEY_CLASSES_ROOT приоритетно над обоими ветками..
В связи с этим возник вопрос : не лишено ли смысла вносить записи одновременно в HKLM и в HKCR, если привести макрос к такому виду (упрощенно) ?
!macro RegisterExtension extenstion
StrCpy $ClassName "KMPlayer.${extenstion}"
WriteRegStr HKCR ".${extenstion}" "" "$ClassName"
WriteRegStr HKLM "SOFTWARE\Classes\.${extenstion}" "" "$ClassName"
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice"
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.${extenstion}\UserChoice" "Progid" "$ClassName"
;;
WriteRegStr HKCR "$ClassName\CLSID" "" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\CLSID" "" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
;
WriteRegStr HKCR "$ClassName\shell" "" "play"
WriteRegStr HKCR "$ClassName\shell\play" "" "Воспроизвести в KMP"
WriteRegStr HKCR "$ClassName\shell\play\command" "" "$PlayCommand"
WriteRegStr HKCR "$ClassName\shell\play\DropTarget" "Clsid" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
;
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell" "" "play"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play" "" "Воспроизвести в KMP"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\command" "" "$PlayCommand"
WriteRegStr HKLM "SOFTWARE\Classes\$ClassName\shell\play\DropTarget" "Clsid" "{9EB4C4CB-74C2-4BE9-AA5D-8249F16020AD}"
!macroend
Я проверил на реальной установке - работает, и ассоциации удаляются макросом де-регистрации через HKCR. Но, вот правильно это или нет, мучают сомнения.
kotkovets
06-07-2011, 16:10
почитал вашу статью про макрос »
Статья не моя, а hb860
В связи с этим возник вопрос : не лишено ли смысла вносить записи одновременно в HKLM и в HKCR »
При записи ассоциаций в HKLM автоматически "создаются" записи и в HKCR и наоборот.
Имеет смысл, явно утверждать не буду, создавать одновременно записи в HKLM "Software\Classes"
и в HKСU "Software\Classes", попробуйте...
wolkow70
07-07-2011, 09:14
Товарищи, подскажите пожалуйста , я правильно делаю?
Скачал плагин UAC plug-in
Файл UAC.nsh скопировал в папку Include.
Файл UAC.dll скопировал в папку Plugins
Создал папку Unicode
Файл UAC.nsh еще скопировал в папку Unicode\Include.
Файл UAC.dll (U) скопировал в папку Unicode\Plugins.
В скрипте прописал:
!include UAC.nsh
Function .OnInit
UAC_Elevate:
UAC::RunElevated
StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user?
StrCmp 0 $0 0 UAC_Err ; Error?
StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper?
Quit
UAC_Err:
MessageBox mb_iconstop "Unable to elevate, error $0"
Abort
UAC_ElevationAborted:
# elevation was aborted, run as normal?
MessageBox mb_iconstop "This installer requires admin access, aborting!"
Abort
UAC_Success:
StrCmp 1 $3 +4 ;Admin?
StrCmp 3 $1 0 UAC_ElevationAborted ;Try again?
MessageBox mb_iconstop "This installer requires admin access, try again"
goto UAC_Elevate
FunctionEnd
RequestExecutionLevel user
Этого достаточно, что бы устанавливать программу на Win7 для любого пользователя?
прописываю строку
Delete "$APPDATA\Photodex\ProShow Producer\def.dat"
но этот файл остается, не удаляется! может еще есть какие-то методы удалить его?..
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC