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

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"'

sk07
28-06-2011, 15:03
начитавшись, я правильно понял, что невозможно "выдрать" скрипт из инсталлятора ?

Hector
28-06-2011, 15:11
sk07, да, правильно

sawe
04-07-2011, 21:25
Не могу разобраться с логикой.
В случае повторной установки (поверх), нужно что бы один файл не переписывался заново и тем более не удалялся, а сохранялся под новым именем.

Что то вроде этого, но не могу понять, как взять именно последнюю цифру


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:


--

K.A.V.
04-07-2011, 21:50
Если точно знаете, что число будет с одной цифрой, могу предложить самый быстрый и простой вариант


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
; и так далее ...... »
А не кажется ли вам, что здесь только циклом, судя по последней увеличивающейся цифре? опредилитесь с условием выхода из цикла и посмотрите в сторону логических конструкций - с ними куда проще работать.

sawe
04-07-2011, 22:22
При каждой последующей установке, что бы последняя (старшая) цифра увеличивалась на +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

sawe
05-07-2011, 01:55
Спасибо, что откликнулись!

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?

sawe
05-07-2011, 17:42
И почему согласно макросам нужно использовать именно 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, Вы когда научитесь использововать теги, скрипт выделяете и жмете #
Больше такое читать больше не буду, пока тегами не научитесь пользоваться

sawe
05-07-2011, 19:03
!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 для любого пользователя?

punsh
07-07-2011, 10:54
прописываю строку
Delete "$APPDATA\Photodex\ProShow Producer\def.dat"

но этот файл остается, не удаляется! может еще есть какие-то методы удалить его?..




© OSzone.net 2001-2012