Показать полную графическую версию : [архив].: NSIS - все вопросы :.
dracosha
25-01-2010, 01:01
Народ!
Нужно добавить еще 2 странички на которых хочу разместить следующее:
страничка 1
"возможность изменять название папки в меню пуск" и "кнопка - создавать папку в меню пуск или нет"
страничка 2
тут я хочу разместить кнопки для создания ярлыков на рабочем столе и в панели быстрого запуска
Если возможно то я бы и на одной страничке все это дело разместил
Господа ГУРУ помогите плиз.
NoName01.cpp
25-01-2010, 01:17
Народ!
Нужно добавить еще 2 странички на которых хочу разместить следующее: »
С созданием страниц у меня проблем нету. Примеры я взял отсюда:
http://nsis.sourceforge.net/Docs/nsDialogs/Readme.html
http://www.winreview.ru/comment.php?comment.news.241.11
Но есть у меня вопрос. В моем инсталляторе 3 секции. Как мне сделать так, чтобы страница появлялась только при условии, что выбрана например первая секция.
Какое условие мне сюда добавить:
Function nsDialogsPage
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd
Заранее спасибо!
страничка 1
"название папки в меню пуск" и "создавать папку в меню пуск или нет"
В начале кода (вставляем в зависимости от того, на каком этапе хотим видеть):
var ICONS_GROUP
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "Моя программа"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
В "-post" секцию добавить
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
Прописываем создание ярлыков в старт меню
!insertmacro MUI_STARTMENU_WRITE_END
страничка 2
тут я хочу разместить кнопки для создания ярлыков на рабочем столе и в панели быстрого запуска
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
Page custom MyDialog_Shortcuts ""
!insertmacro MUI_PAGE_FINISH
Function MyDialog_Shortcuts
setoutpath $PLUGINSDIR
file "shortcuts.ini"
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\shortcuts.ini"
InstallOptions::show /NOUNLOAD
ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 1" "State"
StrCmp $0 "1" 0 NoDesktopShortcuts
# Отмечена галка на создание на рабочем столе, здесь прописываем команды
NoDesktopShortcuts:
ReadINIStr $0 "$PLUGINSDIR\shortcuts.ini" "Field 2" "State"
StrCmp $0 "1" 0 NoQuicklaunchShortcuts
# Отмечена галка на создание в панели быстрого запуска, здесь прописываем команды
NoQuicklaunchShortcuts:
FunctionEnd
Скачайте прикреплённый файл, распакуйте файл "Shortcuts.ini" в папку с вашим скриптом
Но есть у меня вопрос. В моем инсталляторе 3 секции. Как мне сделать так, чтобы страница появлялась только при условии, что выбрана например первая секция.
Какое условие мне сюда добавить:
Function nsDialogsPage
nsDialogs::Create 1018
nsDialogs::Show
FunctionEnd
Вам необходимо создать глобальную переменную и назначить ей "1" в секции, далее проверяете в функции...вообщем давайте я сразу к коду :)
var Sec1_Is_Checked
Section /o "Моя секция №1"
Strcpy $Sec1_Is_Checked "1"
SectionEnd
Function nsDialogsPage
StrCmp $Sec1_Is_Checked "1" 0 Sec1_NOT_Checked
nsDialogs::Create 1018
nsDialogs::Show
Sec1_NOT_Checked:
FunctionEnd
Можно конечно обойтись без создания переменной, командами "SectionGetFlags", если хотите сделать так, то посмотрите мои ранние посты, там я давал примеры, как определить, отмечена секция или нет ;)
А если смотреть лень :) говорите - напишу ;)
K.A.V., а почему InstallOptions, а не nsDialogs ?
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\shortcuts.ini" »
Имхо, nsDialogs попроще
hb860, спасибо большое за статью NSIS. Создаем собственные страницы инсталлятора (http://www.winreview.ru/comment.php?comment.news.241.11) , теперь знаю с чего хоть начинать надо... Но как это обычно бывает осталась масса вопросов.
Все было понятно до выставления координат у элементов, дальше пошли сплошные термины, расчитанные, имхо, на продвинутых нсисников. Страница в инсталяторе появилась, но как сделать, чтобы всё это заработало? Не хватает живого примера на конкретной программе, как вы делали это в предыдущих статьях.
Что непонятно:
- почему в статье доп. страница названа Page custom fnCustomInit fnCustomDestroy, а в том же скрипте к AIMP2 вы использовали более традиционное Page custom nsDialogsPage nsDialogsPageLeave.
- как добавить надписи в шапку, сейчас у меня отображается надпись предыдущей страницы, а это "Выбор папки установки".
- зачем, вообще, в инсталяторе нужен MessageBox MB_OK $R1 (в статье это такое маленькое диалоговое окно).
- главное, как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. В переменных, пока еще, как свинья в апельсинах.
Мой кусок неправильного скрипта, кто сможет выправите, пожалуйста. А, если будут комментарии (пригодиться на будущее) - благодарность будет безмерной...
!include "MUI.nsh" #выбранный интерфейс
!include "nsDialogs.nsh" #плагин для дополнительных элементов
...........
...........
# Окна инсталятора
!insertmacro MUI_PAGE_WELCOME #приветствие
!insertmacro MUI_PAGE_DIRECTORY #выбор директории
Page custom nsDialogsPage nsDialogsPageLeave #дополнительное окно с выбором ярлыков
!insertmacro MUI_PAGE_INSTFILES #прогресс-бар и копирование файлов
!insertmacro MUI_PAGE_FINISH #готово
# Опции дополнительного окна. НЕЗАКОНЧЕНО! и скорее всего неправильно!
Var Dialog
Var Label
Var CheckBox1
Var CheckBox2
Function nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 0 100% 24u "Выберете желаемые ярлыки программы $(^Name) для установки. Нажмите кнопку «Далее» для продолжения."
Pop $Label
${NSD_CreateCheckBox} 0 45u 100% 10u " Ярлык на Рабочий стол"
Pop $CheckBox1
${NSD_CreateCheckBox} 0 65u 100% 10u " Ярлык на Панель быстрого запуска"
Pop $CheckBox2
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetState} $CheckBox1 $R0
CreateShortCut "$DESKTOP\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}" #впихнул сюда, т.к. не знаю куда, ярлык устанавливается в независимости от статуса чекбоксов
${NSD_GetState} $CheckBox2 $R0
CreateShortCut "$QUICKLAUNCH\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}" #впихнул сюда, т.к. не знаю куда, ярлык устанавливается в независимости от статуса чекбоксов
FunctionEnd
K.A.V. спасибо за shortcuts.ini, но хотелось бы разобраться с nsDialogs.
NoName01.cpp
25-01-2010, 14:07
как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. В переменных, пока еще, как свинья в апельсинах »
Я делал так:
Var CheckLink
Var CheckDLink
Var Link
Var DLink
Function LinkPage
nsDialogs::Create 1018
${NSD_CreateCheckbox} 0 50u 100% 10u $(Name_DLink)
Pop $CheckDLink
${NSD_CreateCheckbox} 0 65u 100% 10u $(Name_Link)
Pop $CheckLink
${NSD_SetState} $CheckDLink ${BST_CHECKED}
${NSD_SetState} $CheckLink ${BST_CHECKED}
nsDialogs::Show
FunctionEnd
Function LinkPageLeave
${NSD_GetState} $CheckDLink $DLink
${NSD_GetState} $CheckLink $Link
FunctionEnd
а потом в секции проверка:
${If} $Link = ${BST_CHECKED}
;тут создаем ярлыки в пуск
${EndIf}
${If} $DLink = ${BST_CHECKED}
;тут создаем ярлыки на рабочий стол
${EndIf}
Может кто-то знает, что нада сделать, чтобы инсталлятор был вот такого вида (я имею ввиду окно на заднем плане):
http://s3.sendpic.ru/i/10125/t/d2.jpeg (http://s3.sendpic.ru/i/10125/i/d2.jpeg.html)
Уже решил этот вопрос: BGGradient
dracosha
25-01-2010, 15:26
K.A.V., спасибо большое!
В ini текст только на русском языке.
Но меня стало смущать вот это:
Имхо, nsDialogs попроще »
Получается что там все просто, а я понять немогу как мне сделать то что я хочу.
K.A.V., помню что у Вас куча работы и Вы пишете новый проект с нуля, но в основном Вы мне и помогаете :)
Пожалуйста! Помогите решить мои 2 вопроса при помощи nsDialogs и с возможностью вывода всего текста на окошках на разных языках.
ps Можно ли осуществить то что я хочу на одной страничке? Если можно то лучше конешно же все на одной.
Делаю тихую установку приложения с ключом /S. Всё нормально, но в самом конце программа запускается, а мне это не надо. Есть ли ключ, отменяющий запуск? Или как прописать для такого случая тихую установку без запуска программы?
ChVL,
Нет ключа
дистрибутив.exe /s
ping -t 5 127.0.0.1
taskkill /IM чтозапустилось.ехе /F
Вот так сделайте
dracosha
25-01-2010, 19:37
hb860, может Вы мне с этим (http://forum.oszone.net/post-1328980-341.html) поможете используя nsDialogs? Совсем не понимаю как мне это сделать.
hb860
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку?
fnCustomInit fnCustomDestroy »
nsDialogsPage nsDialogsPageLeave »
Это всего лишь названия функций, назовите хоть Vasaya1 и Vasaya2, будет работать одинаково
как добавить надписи в шапку, »
Function nsDialogsPage
nsDialogs::Create 1018
Pop $Dialog
!insertmacro MUI_HEADER_TEXT "Опа-опа" "Вот оно чё, Михалыч(с)"
зачем, вообще, в инсталяторе нужен MessageBox MB_OK $R1 »
Для примера- главное, как связать (в моем случае) чекбоксы с ярлыками и файлами инсталируемой программы. »
Function nsDialogsPageLeave
${NSD_GetState} $CheckBox1 $R0
StrCmp $R0 0 +2
CreateShortCut "$DESKTOP\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}"
${NSD_GetState} $CheckBox2 $R0
StrCmp $R0 0 +2
CreateShortCut "$QUICKLAUNCH\${PR_NAME}.lnk" "$INSTDIR\${PR_EXE}"
FunctionEnd
hb860, может Вы мне с этим поможете используя nsDialogs? Совсем не понимаю как мне это сделать. »
Я напишу вам это, если уважаемый K.A.V. не сделает раньше.
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку? »
На всякий пожарный. Лишней она не будет, честное слово.
У меня тут мысль в голову пришла
Использовать несколько инсталляторов NSIS, главный файл будет инсталлятором (маленький размер, чисто для запуска других), остальные будут как архивы (можно изменить на любое расширение отличное от EXE), каждый из инсталлеров будет принимать от главного инсталлера путь, куда следует распаковать файлы и будет их распаковывать »
Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо).
NoName01.cpp, hb860, спасибо огроменное! :up
Когда разжуют, кажется всё таким простым... Взял на вооружение метод hb860: минимум символов и буковок - работоспособность 100%.
Шапка с "Опа-опа" "Вот оно чё, Михалыч(с)" смотрится классно :lol: .
dracosha
26-01-2010, 21:23
hb860, совершенно случайно узнал что в nsis есть стандартная страничка MUI_PAGE_STARTMENU. Вобщем эту страничку я добавил... Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска.
K.A.V., а почему InstallOptions, а не nsDialogs ?
Пожалуйста! Помогите решить мои 2 вопроса при помощи nsDialogs
Я с nsDialogs не знаком и никогда им не пользовался, меня устраивает функционал и удобство InstallOptions и я не вижу причин в данный момент изучать что-то новое
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »
На этой и предыдущей странице топика есть 3 варианта решения проблемы:
#343 (http://forum.oszone.net/post-1329051-343.html), #346 (http://forum.oszone.net/post-1329361-346.html), #352 (http://forum.oszone.net/post-1329708-352.html).
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »
Я подобные вопросы решаю секциями
SectionGroup "Ярлыки"
Section "В меню Пуск"
SectionIn 1 2 3
SetShellVarContext all
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Удалить ${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section "На рабочем столе"
SectionIn 1
SetShellVarContext all
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
SectionEnd
Section "В панели быстрого запуска"
SectionIn 1
SetShellVarContext all
CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$INSTDIR\aimp2.exe"
SectionEnd
SectionGroupEnd
Может и вам есть смысл так сделать ?
hb860, совершенно случайно узнал что в nsis есть стандартная страничка MUI_PAGE_STARTMENU. »
Я а предполагал что она вас чем-то не устраивает
Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо). »
Интересно даже стало... :) А что там не получилось на автомате всё сделать? :)
hb860,
Код:
дистрибутив.exe /s
ping -t 5 127.0.0.1
taskkill /IM чтозапустилось.ехе /F
Вот так сделайте
Работает, но кривовато. Дело в том, taskkill убивает уже имеющийся в памяти процесс, а потому установку дистрибутива приходится проводить до конца, и только после этого появившийся процесс убивать. При такой процедуре в конце мелькают окна, что не есть good.
В идеале надо бы предотвратить запуск исполняемого файла. Но, похоже, слишком многого хочу…
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC