PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 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

iglezz
10-10-2019, 08:21
Как сделать, что бы при выборе папки установки дописывалась папка приложения?
Пример: "C:\Program Files\Proga\", а не так "C:\Program Files". »
В зависимости от того, о каком сценарии идет
Это может быть
InstallDir "$PROGRAMFILES\Proga"
или
StrCpy $INSTDIR "$INSTDIR\Proga"
или
SetOutPath "$INSTDIR\Proga"

Как удалить пустую папку при закрытии инсталлятора или при нажатии кнопки отмена? »
RMDir "FOLDERNAME"
Подробности в справке (https://nsis.sourceforge.io/Docs/Chapter4.html#rmdir)

K.A.V.
10-10-2019, 15:17
Как удалить пустую папку при закрытии инсталлятора »
Упорно сопротивляетесь к чтению справочника

Function .onGUIEnd
RMDIR /r "путь_к_папке"
FunctionEnd


или при нажатии кнопки отмена? »
!define MUI_CUSTOMFUNCTION_ABORT custom_abort

Function custom_abort
MessageBox MB_YESNO|MB_ICONQUESTION "Отменить установку?" IDYES +2
abort
RMDIR /r "путь_к_папке"
FunctionEnd

AlekseyPopovv
10-10-2019, 15:25
K.A.V., Спасибо, сам разобрался... Вроде всё сделал как хочется. Теперь осталось добавить ключи тихой установки. Это тёмный лес для меня... :closed-to

K.A.V., Не разобрался...
Function Button
${If} $Radio == 1
Pop $Button
nsDialogs::SelectFolderDialog "Выберите папку для установки:" "$INSTDIR"
Pop "$INSTDIR"
${If} "$INSTDIR" != error
${NSD_SetText} $Text3 "$INSTDIR\${APP}"
${EndIf}
${EndIf}
FunctionEnd
Как сделать, что бы при нажатии на кнопку "Обзор..." создавалась папка (что бы в проводнике была выбрана она) и при нажатии отмена она удалялась (так как пустая) и при повторении действий было всё чётко?

K.A.V.
10-10-2019, 16:51
что бы при нажатии на кнопку "Обзор..." создавалась папка (что бы в проводнике была выбрана она) »
Перед
nsDialogs::SelectFolderDialog
добавить команду на создание папки...

и при нажатии отмена она удалялась »
При нажатии "отмена" в nsDialogs::SelectFolderDialog??
У вас же там написано условие, если error => то пользователь отменил выбор, значит в этом участке прописать удаление папки...

AlekseyPopovv
10-10-2019, 16:54
K.A.V., Я так делал, если выбрать и отменить, то всё работает, если выбор нажать опять, то папка не успевает создаваться и список сбрасывается.
При нажатии ок всё чётко.

K.A.V.
10-10-2019, 16:59
Теперь осталось добавить ключи тихой установки. Это тёмный лес для меня... »
А сколько раз здесь нужно написать "читайте справку", чтобы вы её прочитали? Помню, было время, я здесь специально на вопросы не отвечал, ответы на которые написаны в справочнике, т.к. куча однотипных вопросов просто начинает надоедать, собственно, почему и справочник отчасти был заброшен, т.к. читают его единицы

По вашему вопросу:
GetParameters
GetOptions


папка не успевает создаваться »
эм, ну можно попробовать всунуть мини-цикл на проверку существования папки, но даже не знаю...либо команду Sleep впихнуть после создания папки

AlekseyPopovv
10-10-2019, 17:12
Ставил Sleep 500, не идёт. При нажатии ок всё хорошо, создаётся и удаляется, при нажатии отмена первый раз всё как надо, если выбирать второй раз, то всё, скидывает на папку "Мои документы".
Буду думать...

K.A.V.
10-10-2019, 17:26
Буду думать... »
Вы внимательнее смотрите на свой код, вы используете $INSTDIR как переменную для возвращаемого значения плагином nsDialogs, соответственно, если вы жмёте "отмена", то в $INSTDIR помещается значение error
Потом вы опять хотите показать этот диалог и ставите папкой по-умолчанию значение $INSTDIR, которое при втором вызове после "отмены" содержит возвращаемое значение после предыдущей отмены, т.е. error

AlekseyPopovv
10-10-2019, 17:29
Так я и не пойму.
Я убирал эти строки, результат тот же:
${If} "$INSTDIR" != error
${NSD_SetText} $Text3 "$INSTDIR\${APP}"
${EndIf}

K.A.V.
10-10-2019, 17:35
Не используйте $INSTDIR как переменную для возвращаемых значений и будет вам счастье
У вас же есть $0-$9, $R0-R9...

Function Button
${If} $Radio == 1
Pop $Button
nsDialogs::SelectFolderDialog "Выберите папку для установки:" "$INSTDIR"
Pop $0
${If} $0 != error
${NSD_SetText} $Text3 "$0\${APP}"
StrCpy $INSTDIR "$0\${APP}"
${EndIf}
${EndIf}
FunctionEnd

AlekseyPopovv
11-10-2019, 14:19
Как поменять цвет нижней части инсталлятора/деинсталлятора?

MKN
11-10-2019, 16:24
Как поменять цвет нижней части инсталлятора/деинсталлятора? »
Раскрашивать странички инст.-анинст. лучше с помощью SkinH.dll (SkinSharp). Перечень всех функций, которые поддерживает библиотека SkinH.dll, обстоятельно расписал Flix. Про это уже было в теме.

AlekseyPopovv
13-10-2019, 20:23
Как сделать, что бы с ключом /S ни чего не устанавливалось? А с ключом /S /I то что мне нужно. И ключ /D=путь не работает.
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
${EndIf}
${EndIf}

iglezz
13-10-2019, 20:45
Как сделать, что бы с ключом /S ни чего не устанавливалось? »
В данном случае можно обойтись таким способом:
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
{Else} ; эта пара строк обеспечит выход
Quit ; при отсутствии параметра /I
${EndIf}
${EndIf}
Думаю, что код можно переписать лучше, но для этого нужно видеть больший его кусок.
И ключ /D=путь не работает. »
Пример нерабочей строки?
Согласно справки (пункт 3.2.1) параметр /D должен быть последним, путь не должен содержать кавычек.
В справке это, вроде бы, не упомянуто: все встроенные параметры пишутся с прописной буквы (/S /D, а не /s /d)

AlekseyPopovv
19-10-2019, 14:45
В данном случае можно обойтись таким способом: »
А как в данном случае? :o
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
${ElseIf} ${Errors}
Quit
${Else}
ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$EXEDIR\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
Quit
${ElseIf} ${Errors}
Quit
${Else}
ClearErrors
${EndIf}
${EndIf}
${EndIf}

K.A.V.
19-10-2019, 21:28
Если вам сложно ориентироваться в ${If} конструкциях, то лучше на начальном этапе обойдитесь без них, а когда "набьёте" руку и будете легко накидывать большинство кода - можете попробовать снова осилить конструкции с ${If}
В вашем коде не то, что все ключи будут обработаны, а инсталлятор закроется сразу после запуска с ключем /S (тихая установка), по причине, указанной выше - намудрили с конструкцией.
Для начала могу посоветовать вам форматировать свой код и писать комментарии (в первую очередь для себя), т.к. частенько при больших размерах кода или из-за недостаточного опыта (да и достаточного), можно допускать ошибки и не видеть их у себя под носом (по личному опыту)

Смотрите, как сейчас отрабатывает ваш код (ваша построенная логика):
Запускаем с ключем /S

Есть ключ /I?
Да => Отрабатываю пару команд. Выход из инсталлера
Нет => Выход из инсталлера

До проверки /P ваш код никогда не дойдёт с тихой установкой
Накидаю вам пару одинаковых примеров:

1. Если тихая установка, проверяю наличие сначала ключа I (выполняю команды), затем ключа P (выполняю команды). Если тихая установка, то выход из инсталлера после проверки ключей
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors} ; проверка ключа /I
MessageBox MB_OK "ключ /I есть"
${EndIf} ; проверка ключа /I завершена
ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors} ; проверка ключа /P
MessageBox MB_OK "ключ /P есть"
${EndIf} ; проверка ключа /P завершена
Quit
${EndIf} ; проверка на тихую установку завершена

2. То же самое, только без ${If} конструкций
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
IfErrors noIkey
MessageBox MB_OK "ключ /I есть"
noIkey:

ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
IfErrors noPkey
MessageBox MB_OK "ключ /P есть"
noPkey:
Quit
${EndIf} ; проверка на тихую установку завершена

3. То же самое, только без ${If} конструкций и с обёрткой в функции
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
IfErrors +2
Call silent_I_key

ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
IfErrors +2
Call silent_P_key
Quit
${EndIf} ; проверка на тихую установку завершена

Function silent_I_key
MessageBox MB_OK "ключ /I есть"
FunctionEnd

Function silent_P_key
MessageBox MB_OK "ключ /P есть"
FunctionEnd

AlekseyPopovv
20-10-2019, 13:48
Как удалить папку с деинсталлятором из папки $TEMP?

AlekseyPopovv
22-10-2019, 19:25
Мне вот больше всего нравится, что многие знают как защитить инсталлятор от распаковки, т.к. сами этим пользуются. Отправляют искать на просторах интернета, а потом говорят что ты этого ни где не найдёшь, и теперь даже не купишь. Это что, секретная разработка какая то? Или вы это купили по цене квартиры? Прям всё желание отбивает что то писать...

K.A.V.
22-10-2019, 20:07
Как удалить папку с деинсталлятором из папки $TEMP? »
Можно воспользоваться ключом "/REBOOTOK" в команде удаления папки/файла, при указании данного ключа и невозможности удаления в момент исполнения инсталлятора, папка/файл будет удалена после перезагрузки Windows
Если нужно удалить без перезагрузки, то можно сделать отдельный EXE, запускать его со своим ключом, передавая полный путь удаляемого файла деинсталлятора.
В коде отдельного EXE, соответственно, нужно будет прочитать значение переданного пути файла деинсталлятора и, поместив в цикл с ожиданием и проверкой существования файла - пытаться удалять файл деинсталлятора
Может есть еще какие более красивые методы, не особо интересовался этим вопросом последние "цать" лет :)

Мне вот больше всего нравится, что многие знают как защитить инсталлятор от распаковки, т.к. сами этим пользуются. Отправляют искать на просторах интернета, а потом говорят что ты этого ни где не найдёшь, и теперь даже не купишь. Это что, секретная разработка какая то? Или вы это купили по цене квартиры? Прям всё желание отбивает что то писать... »
Вам пошаговое руководство написать? Люди скрипты на NSIS не все могут писать, а уж писать огромную статью, как пересобрать билд NSIS - ну такое себе...Да и кому это нужно?
В официальной справке есть Appendix G: Building NSIS, это вам поможет вам пересобрать билд.
На вопрос "Как защитить инсталлятор от распаковки" отвечу вам просто: секретной кнопочки нет, которая бы делала это в 1 клик.
Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005...

1. Качаете исходники NSIS
2. Правите нужные файлы в нужных местах
3. Правите файлы заголовочных файлов упаковщиков
4. Собираете свой билд NSIS
5. Его все благополучно вскрывают, т.к. метод всем давно известный
Так какой смысл в этой "защите"?

AlekseyPopovv
22-10-2019, 20:13
Можно воспользоваться ключом "/REBOOTOK" »
Так и сделал.
5. Его все благополучно вскрывают, т.к. метод всем давно известный »
По ходу мне только одному не известный. :o




© OSzone.net 2001-2012