Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: megane68
Дата сообщения: 14.07.2015 15:01
Victor_VG
В общем раз никаких больше предложений не поступило, то пришлось воспользоваться таки функцией ожидания завершения процесса из nsProcess"
${ProcessWait} "tv.exe" "5000" $0

Спасибо!
Автор: Victor_VG
Дата сообщения: 14.07.2015 15:58
megane68

Вызова ${ProcessWait} в NsProcess нет, есть только ${nsProcess::CloseProcess} ждущий три секунды до выдачи KillProcess(). И с DLL всё не так просто - сама по себе она не может быть загружена и её зовёт ЕХЕ, но бывает что из-за внутренней ошибки может не выгружаться, тогда можем попробовать так:

m1:
${nsProcess::CloseProcess} TV.exe $R9
StrCmp $R9 602 +1
${nsProcess::FindProcess} TV.exe $R9
StrCmp $R9 0 m1


вот такая логика даст команду TV.exe завершится, и если это не произойдёт будет повторять её до бесконечности пока не закроет процесс.
Автор: megane68
Дата сообщения: 14.07.2015 16:39
Victor_VG
Прошу прощения, это ProcessFunc.nsh из хелпа NSIS.
Мне как то больше подошло.

Добавлено:

Цитата:
И с DLL всё не так просто - сама по себе она не может быть загружена и её зовёт ЕХЕ, но бывает что из-за внутренней ошибки может не выгружаться, тогда можем попробовать так:

Вот тут как раз мне этого не нужно, ибо если ошибка при закрытии EXE, то это должно лечиться в дистрибутиве (tv.exe), а не принудительным киллянием процесса.
Именно поэтому была нужна функция ожидания завершения процесса.
Автор: Victor_VG
Дата сообщения: 14.07.2015 17:38
megane68

Я это вообще отыскал только на PortableApps.com, но ни в сорцах NSIS, ни на сайте этот инклюд вообще не упомянут. Заинтересовал, буду смотреть и для своих задач.
Автор: megane68
Дата сообщения: 14.07.2015 18:04
Victor_VG
Так он прям из хелпа скачивается жмаком по Загрузить.
http://i60.fastpic.ru/big/2015/0714/48/586cc37a2e10e198ddfc3f68a06c5c48.png
Автор: Victor_VG
Дата сообщения: 14.07.2015 18:23
megane68

Это не оригинальная справка NSIS, а пользовательская разработка. Маленькая разница как говорят в Одессе.
Автор: megane68
Дата сообщения: 14.07.2015 19:04
Victor_VG
Автор: Victor_VG
Дата сообщения: 14.07.2015 20:41
megane68

Это даже прекрасно что вы её нашли - я сейчас обмозговываю одну задумку с применением этой библиотеки. И если получится, то мне удастся реализовать то, что у меня не получалось реализовать средствами NsProcess. Просто не хочу садится писать код пока в голове нет полной ясности как реализовать то, что я хочу сделать. Коли я уже несколько лет реализацию откладывал, то пара дней роли не сыграют, а халтурить не в моих правилах.
Автор: BuZzOFF89
Дата сообщения: 17.07.2015 09:54
Можно ли как-то реализовать такое?

Есть файл с названиями элементов. Элементов штук 50 (но может быть и больше). Один элемент - одна строка.
Как сделать так чтоб считывались названия из файла и создавались CheckBox'ы с этими названиями.
Т.к. CheckBox'ов много будет нужно как-то прилепить ещё и scroll...
И как потом проверить статусы отметки всех этих элементов.

P.S. Со считыванием названия и созданием CheckBox'а проблем нет. Не знаю как это зациклить :)

upd1. Наверное только через IO такое получится. Но хотелось бы NSD.

upd2. Сделал на IO. Работает. На NSD можно сделать? IO - не очень удобно...
Автор: megane68
Дата сообщения: 17.07.2015 10:26
Victor_VG
Как там у Вас, получается?
Я тут что- то в ступор впал. Как назначить директорию установки не диск C:\, а %SYSTEM DRIVE%?
Автор: BuZzOFF89
Дата сообщения: 17.07.2015 10:53

Цитата:
Как назначить директорию установки не диск C:\, а %SYSTEM DRIVE%?

Как-то так...

Код: Function .onInit
StrLen $R0 $WINDIR
StrCpy $R0 $WINDIR 3 -$R0
StrCpy $INSTDIR $R0
FunctionEnd
Автор: Victor_VG
Дата сообщения: 17.07.2015 16:18
megane68

Пока времени код написать нет, но как сделать придумал.

Цитата:
Как назначить директорию установки не диск C:\, а %SYSTEM DRIVE%?


StrCpy $INSTDIR $WINDIR 3

BuZzOFF89

Перекидывания через кучу регистров и вычисления StrLen лишнее. Зачем правой задней ногой левое переднее ухо чесать?
Автор: Sanch8
Дата сообщения: 18.07.2015 15:37
megane68
Можно ещё вот-так:

Код: OutFile ExpandEnvStrings.exe
Caption "ExpandEnvStrings"

Function .onInit
ExpandEnvStrings $0 "%SYSTEMDRIVE%"
MessageBox MB_OK|MB_ICONINFORMATION "Системный диск: $0\"
FunctionEnd

Section
    SetAutoClose true
SectionEnd
Автор: Victor_VG
Дата сообщения: 18.07.2015 16:55
Sanch8

И этот код разумнее т.к. исключает возможность ошибок - ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%" , а далее дополняем код по месту.
Автор: megane68
Дата сообщения: 18.07.2015 19:12
Что- то я недопонял.
Мне надо вместо
InstallDir "C:\SimpleTV"
сделать
InstallDir "%SYSTEMDRIVE%\SimpleTV"
Как этот код будет выглядеть полностью?
Автор: Victor_VG
Дата сообщения: 18.07.2015 19:35
megane68

Цитата:
Мне надо вместо

И только-то?

ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\SimpleTV"

а как была изначально определена $INSTDIR этому коду по барабану - он её переопределяет.
Автор: megane68
Дата сообщения: 18.07.2015 20:16
Victor_VG
Я так понимаю, что надо сначала указать InstallDir "C:\SimpleTV", чтобы код её перенаправил, правильно?
Автор: Victor_VG
Дата сообщения: 18.07.2015 20:21
megane68

Нет, код и в лоб сработает.
Автор: megane68
Дата сообщения: 18.07.2015 20:31
Указываю так:

Цитата:

Function .onInit
ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%"
StrCpy $INSTDIR $INSTDIR\SimpleTV
FunctionEnd

В результате в установщике пустое поле директории установки.
Автор: Victor_VG
Дата сообщения: 18.07.2015 21:16
megane68

А про директиву InstallDir <dir> в хидере забыли? Определите её любым мусором до .onInit и всё работает. Например так:

OutFile "setup.exe"
InstallDir "C:\Win32\App" /* ВАЖНО! */
ShowInstDetails show
Function .onInit
ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\SimpleTV"
FunctionEnd
Автор: megane68
Дата сообщения: 18.07.2015 21:25

Цитата:
А про директиву InstallDir <dir> в хидере забыли? Определите её любым мусором до .onInit и всё работает. Например так:

Ну так я про это выше и спрашивал, что нужно указать InstallDir "C:\SimpleTV", а потом код её перенаправит.
Теперь вроде нормально. Позже проверю на системном диске с буквой D:\
Автор: Victor_VG
Дата сообщения: 18.07.2015 21:31
megane68

Да, мне позвонили и я не верно понял ваш вопрос. Наличие директивы InstDir обязательно ибо она и создаёт переменную $INSTDIR, а вот её начальное значение может быть произвольным ибо его всегда можно переопределить в теле кода. И не важно где именно в калбаке, обычной функции или секции - главное до её использования.
Автор: megane68
Дата сообщения: 18.07.2015 21:42
Victor_VG
Ok!
Спасибо.
Автор: Victor_VG
Дата сообщения: 18.07.2015 21:52
megane68

Пожалуйста, будут вопросы - подкидывайте. Я же и у себя в FarUE3 по дороге пару пометок /* рефакторинг v..... пометить в changelog */ поставил дабы после не забыть про сиё хулюганству .
Автор: megane68
Дата сообщения: 18.07.2015 22:35
Victor_VG
Хорошо. Помимо поступления буду спрашивать.
Я ещё с прошлого раза так и не разобрался с RadioButton. Хотел скопировать установщик плеера foobar2000 для своей сборки, но всё как- то руки не доходят.

Добавлено:
Для SimpleTV хотел спросить, можно ли на стандартной странице Page Finish добавить чекбокс запуска не только плеера, но и ещё одной программы или для этого надо свою собственную конечную страницу делать?
Автор: Victor_VG
Дата сообщения: 19.07.2015 00:03
megane68

Типовой вариант финишной страницы всех инсталляторов имеет две возможности - указанная программа и файл README. Так что тут или свою финишную страницу писать или в коде развлекаться. Я предпочитаю второе ибо мне это проще.
Автор: BuZzOFF89
Дата сообщения: 19.07.2015 09:54

Цитата:
можно ли на стандартной странице Page Finish добавить чекбокс запуска не только плеера

Код: !include "MUI2.nsh"

Name "finish_test"
OutFile "finish_test.exe"

!define MUI_FINISHPAGE_RUN_TEXT "RunCheckBox"
!define MUI_FINISHPAGE_RUN "Setup.exe"

!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinShow
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE FinLeave
!insertmacro MUI_PAGE_FINISH

!insertmacro MUI_LANGUAGE "English"

Var CheckBox1
Var Check1

Function FinShow
${NSD_CreateCheckbox} 120u 102u 195u 10u "CustomCheckBox"
Pop $CheckBox1
${NSD_SetState} $CheckBox1 1
SetCtlColors $CheckBox1 "" "${MUI_BGCOLOR}"
FunctionEnd

Function FinLeave
${NSD_GetState} $CheckBox1 $Check1
StrCmp $Check1 1 0 +2
MessageBox MB_OK "CustomCheckBox = $Check1"
FunctionEnd

Section
Sectionend
Автор: Victor_VG
Дата сообщения: 20.07.2015 17:34
megane68

Н-н-да... Весёлая либа - при компиляции валит ANSI makensis v2.46 с порчей стека и вдобавок не работает.

Пробовал:

Цитата:
!include "ProcFunc.nsh"
outfile test.exe
var pid
Function .chk
StrCpy $R7 1
Pop $R5
Pop $pid
StrCmp "G:\dev\far3\Far.exe" $R5 +1 +2
StrCpy $R7 0
Push $R7
FunctionEnd
ShowInstDetails show
Section "main"
${EnumProcessPaths} .chk $R8
${CloseProcess} $pid $R6
DetailPrint $pid
DetailPrint $R5
DetailPrint $R8
DetailPrint $R6
SectionEnd

Дохлый номер - выдаёт мусор и ничего не завершает, а должна завершать процесс запущенный из указанного каталога. В морг.
Автор: MKN
Дата сообщения: 21.07.2015 10:35
Victor_VG

Цитата:
при компиляции валит ANSI makensis v2.46

У меня хедер ProcessFunc.nsh (последней доработки) работает как часы на всех версиях NSIS.
А тот дремучий, что с PortableApps.com, - сплошные глюки...
Автор: Victor_VG
Дата сообщения: 21.07.2015 15:51
MKN

Линком поделись а то я в его версиях запутался...

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.