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

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

Заранее спасибо!

K.A.V.
25-01-2010, 03:15
страничка 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", если хотите сделать так, то посмотрите мои ранние посты, там я давал примеры, как определить, отмечена секция или нет ;)
А если смотреть лень :) говорите - напишу ;)

hb860
25-01-2010, 08:16
K.A.V., а почему InstallOptions, а не nsDialogs ?
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\shortcuts.ini" »
Имхо, nsDialogs попроще

kuchkan
25-01-2010, 14:02
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 Можно ли осуществить то что я хочу на одной страничке? Если можно то лучше конешно же все на одной.

ChVL
25-01-2010, 18:56
Делаю тихую установку приложения с ключом /S. Всё нормально, но в самом конце программа запускается, а мне это не надо. Есть ли ключ, отменяющий запуск? Или как прописать для такого случая тихую установку без запуска программы?

hb860
25-01-2010, 19:30
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? Совсем не понимаю как мне это сделать.

ChVL
25-01-2010, 19:54
hb860
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку?

hb860
25-01-2010, 20:10
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. не сделает раньше.
Спасибо.
Действительно, дистрибутив и исполняемый файл имеют разные названия. Для чего тогда вводить задержку? »
На всякий пожарный. Лишней она не будет, честное слово.

It4a
26-01-2010, 02:10
У меня тут мысль в голову пришла
Использовать несколько инсталляторов NSIS, главный файл будет инсталлятором (маленький размер, чисто для запуска других), остальные будут как архивы (можно изменить на любое расширение отличное от EXE), каждый из инсталлеров будет принимать от главного инсталлера путь, куда следует распаковать файлы и будет их распаковывать »
Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо).

kuchkan
26-01-2010, 11:14
NoName01.cpp, hb860, спасибо огроменное! :up
Когда разжуют, кажется всё таким простым... Взял на вооружение метод hb860: минимум символов и буковок - работоспособность 100%.
Шапка с "Опа-опа" "Вот оно чё, Михалыч(с)" смотрится классно :lol: .

dracosha
26-01-2010, 21:23
hb860, совершенно случайно узнал что в nsis есть стандартная страничка MUI_PAGE_STARTMENU. Вобщем эту страничку я добавил... Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска.

K.A.V.
27-01-2010, 08:44
K.A.V., а почему InstallOptions, а не nsDialogs ?
Пожалуйста! Помогите решить мои 2 вопроса при помощи nsDialogs
Я с nsDialogs не знаком и никогда им не пользовался, меня устраивает функционал и удобство InstallOptions и я не вижу причин в данный момент изучать что-то новое

kuchkan
27-01-2010, 10:58
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »
На этой и предыдущей странице топика есть 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).

hb860
27-01-2010, 12:23
Но еще нужна страничка с возможностью добавления ярлыков на рабочий стол и панель быстрого запуска. »
Я подобные вопросы решаю секциями

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. »
Я а предполагал что она вас чем-то не устраивает

K.A.V.
27-01-2010, 18:59
Над этим тоже думал с самого начала, NSIS вызывающий NSIS. Пробывал 7z SFX, слишком рамки ограничены, т.е. той гибкости котарая мне нужна нет. На данный момент я сделал ровно наполовину, т.е. весь процесс автоматизировать не получилось(но уже хорошо). »
Интересно даже стало... :) А что там не получилось на автомате всё сделать? :)

ChVL
27-01-2010, 20:26
hb860,


Код:

дистрибутив.exe /s
ping -t 5 127.0.0.1
taskkill /IM чтозапустилось.ехе /F

Вот так сделайте
Работает, но кривовато. Дело в том, taskkill убивает уже имеющийся в памяти процесс, а потому установку дистрибутива приходится проводить до конца, и только после этого появившийся процесс убивать. При такой процедуре в конце мелькают окна, что не есть good.
В идеале надо бы предотвратить запуск исполняемого файла. Но, похоже, слишком многого хочу…




© OSzone.net 2001-2012