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

Aster
06-03-2012, 20:20
Большое спасибо. вроде примерно понял.
Вы привели пример File Progress
Там также есть Detail и Gradual progress. Неплохо бы узнать чем они отличаются.
В моём установщике несколько компонентов, которые устанавливаются по желанию клиента. Т.е несколько секций в скрипте имеется... Как в этом случае сохранить адекватность продвижения прогресс бара, если заранее не известно будет ли клиент устанавливать тот или иной компонент или нет. Первая секция обязательна к установке остальные на выбор.
На примере двух секций.
;__________________________________________________
Section "Ключевые составляющие" Sec1
SectionIn RO
RealProgress::FileProgress /NOUNLOAD 0
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 20 ;установка прогресса на 20%.
Sleep 300 ;[блок команд]
RealProgress::FileProgress /NOUNLOAD 40
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 60
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 80
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD 100 ;установка прогресса на 100%.
SectionEnd
Section "Авторские обновления" Sec2
Sleep 300 ;[блок команд]
RealProgress::AddProgress /NOUNLOAD ??? ;какой параметр прогресса должен быть?
SectionEnd
;__________________________________________________
Какой параметр прогресса должен быть в случае если клиент захочет установить "Авторские обновления"? По скрипту выходит что после выполнения первой секции прогресс-бар будет на 100%, а установка не завершится, т.к пойдёт выполнения следующей секции. С другой стороны - если клиент не захочет устанавливать "Авторские обновления", то тогда прогресс 100 в первой секции правильный... Довольно сумбурная схема... Как бы так сделать чтобы волков накормить, и овец сохранить? »

Решил вот тоже побаловаться с этим плагинчиком для реального прогресса. По командам Вашего примера выходит, что на команде RealProgress::AddProgress /NOUNLOAD 60 прогресс уже будет на 100%, ибо:

Могу Вам сказать, что команда RealProgress::AddProgress /NOUNLOAD XX отвечает не за установление прогресса на определённом проценте, а за добавление процентов прогресса.
Т.е Вы ставите скажем RealProgress::AddProgress /NOUNLOAD 20 (где 20 - прибавляемый процент). Далее ставите RealProgress::AddProgress /NOUNLOAD 40, прогресс-бар будет на уровне 60%, а не 40%, т.к стартовую величину задала предыдущая команда. 20+40=60.

Команда же RealProgress::FileProgress XX ориентируется на постепенное продвижение до заданного параметра (XX - процент продвижения до которого двигается прогресс бар). Т.е скажем вы установили RealProgress::FileProgress 20. В момент установки (в зависимости от ваших команд) идёт извлечение файла, пока идёт это извлечение - индикатор прогресса постепенно продвигается до 20%.

А за установление прогресса на определённом проценте отвечает команда RealProgress::SetProgress /NOUNLOAD 10 (где 10 - процент прогресса). На любом этапе установки Вы можете выставить эту команду и прогресс бар будет заполнен на указанный вами процент.

Рекомендую грамотно смешивать эти возможности.
Если продуманно подойти, то прогресс-бар будет максимально реальным.
Ну а автору плагина (Afrow UK) большой респект.

Sidril
06-03-2012, 20:45
Aster, да, теперь всё окончательно понятно. спасибо
RealProgress::SetProgress /NOUNLOAD вот что нужно было юзать мне

Lisabon
06-03-2012, 21:56
Paval, Пишу инсталяцию на nsis. В дополнение к основному продукту нужно еще поставить пару отдельных программ. Я их упаковываю в свой инсталятор. И прописываю на исполнение ExecWait.
Вроде объяснил понятно. Теперь, как их вызвать в пассивном режиме и прописать путь для установки. »


ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VCRedist.msi /qn"'


или


ExecWait '"$INSTDIR\VCRedist_x64.exe" /q:a /c:"msiexec /i VC_Red.msi /qn"'

wolkow70
07-03-2012, 18:05
Товарищи подскажите оптимальное решение таких задач:

1. Нужно скопировать (распаковать) файл в системную папку, при соблюдении условия, если в ней нет одноименного файла более новой версии.

2. Соответсвенно при деинсталляции комманда на удаление этого файла, если он имеет определенную версию (файл новой версии не должен удаляться).

Задача возникла из-за того, что две программы от одного производителя ставят драйвера службы дефрагментации, причем в одной программе версия более новая.

kotkovets
07-03-2012, 18:36
wolkow70, Получать версию файла умеете?
ну так сравните исходно устанавливаемую версию с полученной версией файла, при наличии файла,
иначе ставим файл какой есть в установщике.
!include "filefunc.nsh"
!include "WordFunc.nsh"
!define VERSION_FILE "3.7.61b" ;(исходная) версия файла в скрипте, которая будет "ставится"

${If} ${FileExists} "$WINDIR\notepad.exe"
${GetFileVersion} "$WINDIR\notepad.exe" "$0"
;конвертируем версию в "циферки" при наличии указанных символов
${VersionConvert} "$0" "abcdefghijklmnopqrstuvwxyz+" "$0"
;конвертируем версию файла в установщике
${VersionConvert} "${VERSION_FILE}" "abcdefghijklmnopqrstuvwxyz+" "$1"
;сравниваем исходно полученную и исходно устанавливаемую версии файлов
;-----------------------------------------------------
;${VersionCompare} "[Version1]" "[Version2]" $var
;-----------------------------------------------------
;"[Version1]" ; первая версия
;"[Version2]" ; вторая версия
;$var ; результат:
;$var=0 версии равны
;$var=1 первая версия новее второй
;$var=2 вторая версия новее первой
;-----------------------------------------------------
${VersionCompare} "$0" "$1" $2
${If} $2 == 0
MessageBox MB_OK "Версии равны!$\n$0 = $1" IDOK
${ElseIf} $2 == 1
MessageBox MB_OK "Полученная версия новее исходной(устанавливаемой)$\n$\t $0 > $1" IDOK
${ElseIf} $2 == 2
MessageBox MB_OK "Исходная(устанавливаемая)версия новее полученной$\n$\t $0 < $1" IDOK
${EndIf}
${Else}
;тут всегда ставим, файла нету!!!
${EndIf}
Здесь легко потренироваться, подставляя циферки в константу

BuZzOFF
08-03-2012, 11:40
kotkovets, не могу понять как сделать проверку выбран ли пункт в SectionGroup или нет...
И в зависимости от того выбран он или нет выполнить в другой Section (не в SectionGroup) то или иное действие.
Всяко разно извращаюсь, но так и не получается :(
И как всегда всё окажется проще простого :D

kotkovets
08-03-2012, 12:42
BuZzOFF, секционная группа имеет. если не ошибаюсь, 5 состояний:
1. группа вся выбрана - т.е все секции в группе выбраны
2. группа частично выбрана - т.е секция выбрана, а другие не выбраны, не важно количество выбр. или не выбр. секций
3. группа не выбрана - т.е все секции в группе не отмечены.
4. группа свернута - секции спрятаны в группе
5. группа развернута - т.е видны все секции в группе.
Если нужно найти определенную секцию - отмечена или нет, то группа по барабану.
Если нужно, проверить состояние группы, здесь надо учитывать флаг еще: развернута группа или нет.
почитайте в справке: » SectionGetFlags: получаем статус секции, там мало букафф.
что не поймете - пишите.
кстати я всегда снимаю состояние секций в функции закрытия странички компонентов, очень удобно,
ибо я уже знаю, на страничке установки какие секции отмечены или нет, с любой отмеченной секции,
на страничке установки, ведь код будет выполняться, только, если секция отмечена :)

BuZzOFF
08-03-2012, 12:46
нужно найти определенную секцию - отмечена или нет »Вот это надо :)
Ушёл читать.
Спасибо.

BuZzOFF
09-03-2012, 07:48
kotkovets, что не получается...
http://s14.directupload.net/images/120309/temp/vycbfy9x.png (http://s14.directupload.net/images/120309/vycbfy9x.png)
Выбираю оригинал (пофиг тихая/не тихая) запускается обычная установка.
Выбираю mod (пофиг тихая/не тихая) запускается mod в тихом режиме.
Такие вот пироги...
Вот часть скрипта:
SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd

Section "Тихая" secSilent
SectionEnd
SectionGroupEnd

Section "Оригинал" secOriginal
SectionGetFlags ${secNormal} $0
${If} $0 == 1
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1'
${Else}
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /qn'
${EndIf}
SectionEnd

Section /o "Mod" secMod
SectionGetFlags ${secNormal} $0
${If} $0 == 1
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst"'
${Else}
ExecWait '$\"${OutDir}\setup.exe$\" /pSKIPPRODUCTCHECK=1 /v"TRANSFORMS=ksospc.ru.mst /qn"'
${EndIf}
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${secNormal}
!insertmacro RadioButton ${secSilent}
!insertmacro EndRadioButtons

!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${secOriginal}
!insertmacro RadioButton ${secMod}
!insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
StrCpy $1 ${secSilent}
StrCpy $2 ${secOriginal}
FunctionEnd

"Рожденный ползать - летать не может!"
Видать несудьба мне с этим NSIS :teeth:

wolkow70
09-03-2012, 08:45
kotkovets,
Помогите разобраться с автозакрытием программ
Нужно перед установкой Орбита закрыть браузеры

В скрипте:

!include WinMessages.nsh

Function CloseProgram
Exch $1
Push $0
loop:
FindWindow $0 $1
IntCmp $0 0 done
#SendMessage $0 ${WM_DESTROY} 0 0
SendMessage $0 ${WM_CLOSE} 0 0
Sleep 100
Goto loop
done:
Pop $0
Pop $1
FunctionEnd


Function .onInit
;
loop:
FindWindow $0 "IEFrame"
IntCmp $0 0 done
IsWindow $0 0 done
System::Call 'user32::PostMessageA(i,i,i,i) i($0,${WM_CLOSE},0,0)'
Sleep 100
Goto loop
done:
;
Push "MozillaWindowClass"
Call CloseProgram

Push "OperaWindowClass"
Call CloseProgram
;
FunctionEnd

IE закрывается , а FireFox и Opera нет.
Классы заголовков смотрел в Win32Spy.

BuZzOFF
09-03-2012, 08:56
закрыть браузеры »
Я конечно очень не спец...
А если искать процессы по имени и "убивать"? Не канает?

Справочник по NSIS => Примеры кодов => Process.

извращенная логика »
Спасибо :teeth:

wolkow70
09-03-2012, 09:31
А если искать процессы по имени и "убивать"? Не канает? »
Канает. Так и было. Только это не "хороший тон", хочу красиво сделать.

kotkovets
09-03-2012, 12:54
BuZzOFF, Чет у вас извращенная логика, проще-проще, вот на кой черт нужно еще:
silent mode и normal mode && silent original и normal original?
Не проще сделать всего лишь: silent mode && silent original, при оболочке - выбор, че ставить,
при тихом режиме заводить ключом ком.строки: silent mode или silent original
Хозяин барин:
SectionGroup /e "Тип установки"
Section /o "Обычная" secNormal
SectionEnd

Section "Тихая" secSilent
SectionEnd
SectionGroupEnd

Section "Оригинал" secOriginal
${If} ${SectionIsSelected} ${secSilent}
MessageBox MB_OK "Original [Silent]" IDOK
${Else}
MessageBox MB_OK "Original [Normal]" IDOK
${EndIf}
SectionEnd

Section /o "Mod" secMod
${If} ${SectionIsSelected} ${secNormal}
MessageBox MB_OK "Mod [Normal]" IDOK
${Else}
MessageBox MB_OK "Mod [Silent]" IDOK
${EndIf}
SectionEnd

Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${secNormal}
!insertmacro RadioButton ${secSilent}
!insertmacro EndRadioButtons

!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${secOriginal}
!insertmacro RadioButton ${secMod}
!insertmacro EndRadioButtons
FunctionEnd

Function .OnInit
StrCpy $1 ${secSilent}
StrCpy $2 ${secOriginal}
FunctionEnd
wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил).
Вообще пускай юзер думает, че ему надо-то, поэтому лучше при запущенном браузере, сообщение
о запущенном браузере и выход из установщика - на мой взгляд оптимальный вариант.
!macro CloseProgram NameProgramm
${Do}
Sleep 200
FindWindow $0 "${NameProgramm}"
${IfThen} $0 == 0 ${|}${Break}${|}
MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
SendMessage $0 ${WM_CLOSE} 0 0 ;послать окну сообщение WM_CLOSE
SendMessage $0 ${WM_DESTROY} 0 0 ;разрушить окно
${Loop}
!macroend
Function CloseProgram
System::Store S
${Do}
Sleep 200
FindWindow $0 "IEFrame"
${IfThen} $0 == 0 ${|}${Break}${|}
;послать сообщение немедленно, вне очереди cообщений оконной поцедуры
MessageBox MB_OK "ослика окошко найдено" IDOK
System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
${Loop}
!insertmacro CloseProgram "OperaWindowClass"
!insertmacro CloseProgram "MozillaWindowClass"
System::Store L
FunctionEnd

Function .onInit
Call CloseProgram
FunctionEnd

wolkow70
09-03-2012, 14:19
wolkow70, скрипт какой-то древний китайский, покрыт несвежей пылью(но рабочий):
Если браузер найдется появится сообщение(для отладки добавил). »
Нормально работает. Почему-то окно Mozilla три раза подряд появляется.

kotkovets
09-03-2012, 14:34
wolkow70, Это нормально, пробуйте так, более надежно и быстрее.
FindWindow вызывается в каждом цикле 50 раз с задержкой 2мс, при найденном окне - прерывание цикла.
!macro CloseProgram NameProgramm
${For} $1 1 50
FindWindow $0 "${NameProgramm}"
${If} $0 != 0
MessageBox MB_OK "Окошко -${NameProgramm}-" IDOK
System::Call "user32::PostMessage(ir0,i${WM_CLOSE},i0,i0)"
${Break}
${EndIf}
Sleep 2
${Next}
!macroend
Function CloseProgram
System::Store S
!insertmacro CloseProgram "IEFrame"
!insertmacro CloseProgram "OperaWindowClass"
!insertmacro CloseProgram "MozillaWindowClass"
System::Store L
FunctionEnd
т.е при не найденных окнах - окошко установщика появится где то через 300 мс (если сообщение убрать)
При желании оттачивания надежности, время задержки можно увеличить и количество вызовов FindWindow

wolkow70
09-03-2012, 14:54
kotkovets,
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры.

wolkow70
09-03-2012, 15:21
kotkovets,
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно.

kotkovets
09-03-2012, 15:32
В последнем варианте Mozilla не гасится. В предложенном ранее варианте закрывалась надежно. »
Потому что, у браузера куча окон (скрытых, дочерних, модальных), - Почему-то окно Mozilla три раза подряд появляется
Второй вариант предназначен на одно окно.
кстати во 2 варианте попробуйте убрать макрос - ${Break}
Насколько подобная процедура применима к процессу деинсталляции программы? То есть, при удалении программы тоже надо закрывать браузеры. »
Насколько оно Вам надо то, не забудьте в деинсталляторе вызов функции через приставку - un

wolkow70
09-03-2012, 16:05
кстати во 2 варианте попробуйте убрать макрос - ${Break} »
Не помогает.
Вернулся к первоначальному варианту. Надежно закрывает пять запущенных копий Мозиллы (больше копий запускать не пробовал :)).

wolkow70
10-03-2012, 10:32
Не могу решить одну задачку. Нужно внести при установке программы регистрационные данные из рег-файла.
На 32-битной системе все получается. На 64-битной чего только не шаманил, данные вносятся, но только в раздел HKLM32, а нужно в HKLM64

В скрипте так:

IfFileExists "$EXEDIR\reg.reg" 0 Done
${If} ${RunningX64}
execwait '$windir\SysWOW64\regedit.exe /s "$EXEDIR\reg.reg"'
${Else}
execwait '$windir\regedit.exe /s "$EXEDIR\reg.reg"'
${EndIf}
Done:

В рег-файле:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Ashampoo\Ashampoo UnInstaller 4]
"HLRegKEY"="xxxxxxx-xxxxxxx-xxxxxxxx"




© OSzone.net 2001-2012