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

diakov
19-02-2012, 12:38
kotkovets, все получилось именно с SetShellVarContext current! Спасибо!
Подскажи пожалуйста как организовать выбор языка самого установщика при его запуске? (допустим сделать его (украинским,английски и русским). И еще раз спасибо что ты есть!

kotkovets
19-02-2012, 12:50
diakov,
cмотри в примерах Examples\Modern UI\MultiLanguage.nsi

kotkovets
19-02-2012, 13:15
diakov, смотри еще здесь
http://forum.oszone.net/post-1553443-903.html

wolkow70
20-02-2012, 16:14
Function .OnInit
ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\App"
FunctionEnd
InstallDir "$INSTDIR" »

Сделал таким образом.
В результате директория установки нормально отображается в строке инсталлятора, но не работает ключ /D=путь установки.

Пробовал также так:

Var SysDrive

Function .OnInit
StrCpy $SysDrive $WINDIR 2
FunctionEnd

InstallDir "$SysDrive\app"

В строке не отражается буква диска, только папка (не красиво).
Мне нужно сделать, чтобы и в строке нормально отражалось, и ключ /D нормально работал.

Подмогнете?

kotkovets
20-02-2012, 17:01
Мне нужно сделать, чтобы и в строке нормально отражалось, и ключ /D нормально работал. »
таким способом, нет, у вас всегда предопределяется условие
выбора пути установки в функции .OnInit

wolkow70
20-02-2012, 17:23
таким способом, нет, у вас всегда предопределяется условие
выбора пути установки в функции .OnInit »

Если сделать так:
InstallDir "$SysDrive\app" ,
то не предопределяется, но почему-то букву диска не отображает, только саму папку. Может надо добавить что-то вроде того "$\ ?

diakov
21-02-2012, 22:17
kotkovets, а как с помощью LangString задать текст описания радиобутонов и чекбоксов на кастомной страничке?

diakov
21-02-2012, 22:43
Все разобрался тока не знеаю правильно ли но работает)) вот так вот

В самой функции кастомной странички пишу "$(RadioButton)"


Function PageInit
!insertmacro MUI_HEADER_TEXT "Выбор типа и компонентов установки" "..."
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateLabel} 0u 0u 120u 12u "Пожалуйста, сделайте выбор:"
Pop $Label
;;
${NSD_CreateRadioButton} 0u 15u 150u 12u "$(RadioButton)"
Pop $RadioButton
${NSD_SetState} $RadioButton 1 ;делаем радиобутон отмеченным
${NSD_OnClick} $RadioButton RadioButton ;событие отметки радиобутона


а перед этим пишу

LangString RadioButton ${LANG_RUSSIAN} "значение"
LangString RadioButton ${LANG_ENGLISH} "значение"

diakov
21-02-2012, 23:28
kotkovets, теперь такая загвоздка как на страничке лицензия указать файлы под конкретный язык, пробовал так:

!insertmacro MUI_PAGE_LICENSE "$(LICENSE)"


LangString LICENSE ${LANG_RUSSIAN} "${NSISDIR}\COPYING.rtf"
LangString LICENSE ${LANG_ENGLISH} "${NSISDIR}\COPYING1.rtf"
LangString LICENSE ${LANG_UKRAINIAN} "${NSISDIR}\COPYING2.rtf"

Не получается...вообще ничего не отображает на странице лицензии...

kotkovets
22-02-2012, 00:26
diakov, не получится страничка лицензии, подгрузка файла в окно лицензии - это время компиляции,
а тебе нужно время установки - на подгрузку нужного файла в зависимости от языка установщика.
попробуй плагом: http://nsis.sourceforge.net/CustomLicense_plug-in
!addplugindir .

!include "MUI2.nsh"

Name "BigLicense-Test"
OutFile "biglictest.exe"


!insertmacro MUI_PAGE_WELCOME

!define MUI_PAGE_CUSTOMFUNCTION_SHOW "LICENSE_SHOW" ;эту строку не перемещать!!!
!insertmacro MUI_PAGE_LICENSE "${NSISDIR}\COPYING" ;эту строку не менять!!!

!insertmacro MUI_PAGE_INSTFILES

!insertmacro MUI_LANGUAGE "russian"

Function LICENSE_SHOW
InitPluginsDir
${If} $LANGUAGE == 1049 ;если русский язык установщику
File "/oname=$PLUGINSDIR\info.rtf" "Text\info_ru.rtf"
${ElseIf} $LANGUAGE == 1033 ;если английский язык установщика
File "/oname=$PLUGINSDIR\info.rtf" "Text\info_eng.rtf"
${EndIf}

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1000
CustomLicense::LoadFile "$PLUGINSDIR\info.rtf" $0
FunctionEnd

Section
SectionEnd

Sidril
25-02-2012, 14:45
Добрый день.
Изучал справку NSIS, но к сожалению не нашёл ответа на интересующий меня вопрос. Если вас не затруднит, пожалуйста, подскажите как можно организовать реальный прогресс установки на странице инсталляции? Просто у меня на данный момент получается так, что инсталляция реально не завершена и на половину, а прогресс-бар заполняется уже на 90%.
Поискав плагины на эту тему, обнаружил что имеется NSIS Real Plugin (http://nsis.sourceforge.net/RealProgress_plug-in). Но моя криворукость не позволяет мне понять принцип работы данного плагина... Быть может в стандартных средствах NSIS есть более простой способ решения моей проблемы?
Спасибо!

kotkovets
25-02-2012, 16:13
Изучал справку NSIS, но к сожалению не нашёл ответа на интересующий меня вопрос. Если вас не затруднит, пожалуйста, подскажите как можно организовать реальный прогресс установки на странице инсталляции? Просто у меня на данный момент получается так, что инсталляция реально не завершена и на половину, а прогресс-бар заполняется уже на 90% »
Проблема в Вашем скрипте, может макросе, идет прерывание установки - ИМХО на 100% !
Ищите команды - abort, return - наверняка по неправильным условия срабатывают, а может и правильным...:)

Sidril
25-02-2012, 16:40
kotkovets
Да нет, установка не прерывается. Дело в том что прогресс установки ориентируется на выполнение команд скрипта, т.е к примеру в скрипте 500 команд, если выполнено уже 450 строк, то прогресс-бар заполнится на 90%. Меня это не устраивает, мой инсталлятор построен на принципах запуска и ожидания конца работы внешних приложений, это всё прописано ближе к концу скрипта, поэтому и показывает прогресс 90%... Но работа внешних приложений длится приличное кол-во времени, а прогресс бар как за 5 секунд дошёл до 90% и потом уже не двигается. Установка продолжается - прогресс бар стоит.

Нужно как-то настраивать прогресс-бар... В справочнике по NSIS тоже увы нет примеров для этого. Как-то странно, вроде нормальный прогресс установки - элементарная вещь, а такие вот проблемы (

kotkovets
25-02-2012, 18:06
Установка продолжается - прогресс бар стоит »
Прогрecc бар двигается только по внутренним командам, сообщениям - но не запускам внешних приложений.
попробуйте между перед каждым запуском приложения прописать:
DetailPrint "Установка название приложения"
А ну последней командой в последней секции
DetailPrint "готово"
Можно конечно получить последними командами дескриптор прогресса, найти верхний предел и установить

Sidril
25-02-2012, 22:25
На таких блоках поставлен запуск и ожидание внешних приложений:

SetDetailsPrint textonly
DetailPrint "Установка основных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_old.exe"'

SetDetailsPrint textonly
DetailPrint "Установка дополнительных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_new.exe"'

Задача передо мной стоит чтоб в тот момент когда идёт установка основных компонентов прогресс бар был на 30%, когда начинается установка дополнительных компонентов - на 40% и так далее... Но так понимаю в NSIS это архисложная задача (

kotkovets
25-02-2012, 23:15
Пробуйте так, хотя думаю врядли, nsis тоже двигает прогресс
!macro SETPOS position
FindWindow $R9 "#32770" "" $HWNDPARENT
GetDlgItem $R9 $R9 1004
Intop $R8 300 * ${position}
SendMessage $R9 0x402 $R8 0
!macroend

Section
!insertmacro SETPOS 0 ;устанавливаем на 0%.
SetDetailsPrint textonly
DetailPrint "Установка основных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_old.exe"'

!insertmacro SETPOS 50 ;устанавливаем на 50%.
SetDetailsPrint textonly
DetailPrint "Установка дополнительных компонентов"
SetDetailsPrint listonly
SetOutPath "$INSTDIR"
ExecWait '"$INSTDIR\install_new.exe"
!insertmacro SETPOS 100 ;устанавливаем на 100%.
SectionEnd

Sidril
26-02-2012, 00:02
Спасибо за вариант.
Жаль, но не помогает... Прогресс всё равно стремглав бежит вперёд, ориентируюясь на команды скрипта.
Нужно установить тотальный контроль за прогрессом...
Если вам не сложно, посмотрите что за зверь такой Real Progress plugin. Как его можно использовать в моём случае.
Думаю это не должно пройти за зря, т.к можно потом для пользователей отобразить пример в русской справке по NSIS.
Кстати, спасибо вам за этот справочник. Незаменимая вещь в хозяйстве. Надеюсь проект справки не заброшен и будет обновляться - это в качестве пожелания.
________________________________
Была у меня также мысль (подсмотрел в каком-то из установщиков) относительно того, чтобы когда начинают выполняться функции запуска и ожидания - в этот момент всплывает долнительный мини-прогресс бар где и показывался ход установки компонентов. Но опять же, нигде не нашёл примеров кода по прогрессу.

wolkow70
26-02-2012, 13:31
kotkovets, Подскажите пожалуйста возможно ли сделать такое:

Есть группа секций "Установить Winamp Agent"

В одной из секций опция "Запустить WinampAgent после установки"

Exec "$INSTDIR\winampa.exe"

Как можно реализовать, что бы при установке галочки на чебоксе действительно агент запускался после успешной установки?

Если прописать в функцию Function .onInstSuccess, то как реализовать условие значения в секции?

kotkovets
26-02-2012, 14:34
Есть группа секций "Установить Winamp Agent"
В одной из секций опция "Запустить WinampAgent после установки"
Exec "$INSTDIR\winampa.exe"
Как можно реализовать, что бы при установке галочки на чебоксе действительно агент запускался после успешной установки?
Если прописать в функцию Function .onInstSuccess, то как реализовать условие значения в секции? »
xex...:), проверяете, считываете состояние секции и наличие файлика собственно.
SectionGroup /e "some stuff"

Section "install"
SectionEnd

Section "exec" SEC1
SectionEnd

SectionGroupEnd

Function .onInstSuccess
${If} ${SectionIsSelected} ${SEC1}
${AndIf} ${FileExists} "$INSTDIR\winampa.exe"
Exec "$INSTDIR\winampa.exe"
${EndIf}
FunctionEnd
Нужно установить тотальный контроль за прогрессом...
Если вам не сложно, посмотрите что за зверь такой Real Progress plugin. Как его можно использовать в моём случае. »
Да вроде бы элементарно...допустим у вас есть 5 блоков команд,
т.е после каждого блока команды двигаем на 20%
и так до 100%, т.е рассчитываете сколько у вас блоков однотипных команд и
сотню делите на кол-во блоков однотипных команд.
Section
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

## Unload the plugin so that it can be deleted!
Function .onGUIEnd
RealProgress::Unload
FunctionEnd

Sidril
27-02-2012, 00:19
Большое спасибо. вроде примерно понял.
Вы привели пример 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 в первой секции правильный... Довольно сумбурная схема... Как бы так сделать чтобы волков накормить, и овец сохранить?:)




© OSzone.net 2001-2012