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

» NSIS (Nullsoft Scriptable Install System)

Автор: XCV81
Дата сообщения: 23.02.2010 09:46
есть такая задачка: написать скрипт который (после компиляции) будет запускать другой инсталятор nsis в тихом режиме и записать лог действий (не своих, а тех которые делает запускаемый инсталятор) в файл. С помощью других хороших людей сваял такой скриптик:
;Text/Registry definitions
!define PRODUCT_NAME "Nsis ïåðåõâàò"
!define PRODUCT_VERSION "1.0"
;includes
!include "MUI.nsh"
!include "FileFunc.nsh"
!include "LogicLib.nsh"
SetCompressor /SOLID lzma
; MUI Settings
!define MUI_ABORTWARNING
;!define MUI_ICON "ico.ico"
; Welcome page
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
; Finish page
;!insertmacro MUI_PAGE_FINISH
; Language files
!insertmacro MUI_LANGUAGE "Russian"
!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT 0x102D
Name "${PRODUCT_NAME}"
Caption "Ïåðåõâàò"
OutFile "${PRODUCT_NAME}.exe"
Function DumpLog
Exch $5
Push $0
Push $1
Push $2
Push $3
Push $4
Push $6
FindWindow $0 "#32770" "заголовок окна устанавливаемого инсталятора"
GetDlgItem $0 $0 1016
StrCmp $0 0 error
FileOpen $5 $5 "w"
StrCmp $5 0 error
SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
System::Alloc ${NSIS_MAX_STRLEN}
Pop $3
StrCpy $2 0
System::Call "*(i, i, i, i, i, i, i, i, i) i \
(0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
loop: StrCmp $2 $6 done
System::Call "User32::SendMessageA(i, i, i, i) i \
($0, ${LVM_GETITEMTEXT}, $2, r1)"
System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
FileWrite $5 "$4$\r$\n"
IntOp $2 $2 + 1
Goto loop
done:
FileClose $5
System::Free $1
System::Free $3
Goto exit
error:
MessageBox MB_OK error
exit:
Pop $6
Pop $4
Pop $3
Pop $2
Pop $1
Pop $0
Exch $5
FunctionEnd
Section "Inst"
SetOutPath "$TEMP\files\"
File /r "Files.exe"
Execwait "$TEMP\files\files.exe /S"
SectionEnd
Section "-POST"
push "$DESKTOP\LOG.log"
Call DumpLog
SectionEnd

но он не работает... может поможет кто подправить?
Автор: juvaforza
Дата сообщения: 28.02.2010 20:38
Victor_VG
У вас есть конкретные замечания к переводу vadimsva на предмет некорректной работы? Насколько я понимаю, все файлы собраны из своих ресурсов, а не являются примером "русификаторов".
Автор: Victor_VG
Дата сообщения: 02.03.2010 14:42
juvaforza

Есть только одно - я считаю, что в таких случаях когда мы используем программу для нескольких языков не надо менять её ресурсы. А сделать для неё внешний языковый модуль с динамической подгрузкой по моему оптимальное решение задачи в такой ситуации. Это лично моё мнение, и я его никому навязывать не хочу. Но, мне думается так несмотря на большую сложность решения мы имеем меньше шансов получить сбой.
Автор: jekov
Дата сообщения: 12.03.2010 11:57
Подскажите,пожалуйста,где копать для вставки своего пароля в скрипте http://nsis.sourceforge.net/ADD_"Verify_your_serial_number"_dialog_to_your_Installer_by_ROHIT - видимо где то в {NSISDIR}\Contrib\Modern UI ,поскольку !include "MUI.nsh" ,чего бы не меняя проходит тока через пароль: Verify your serial number
Не так стоят дела тут,где все понятно для меня http://nsis.sourceforge.net/Complex_validating_of_InstallOptions_user_input
Спасибо!
Автор: Victor_VG
Дата сообщения: 12.03.2010 12:24
Обновил свою библиотеку ProcLib до версии 2.5.

Что добавилось?

- добавил макрос MinVer для анализа версии операционной системы и её сравнения с минимально заданной. Если версия ОС равна или выше минимально заданной, то MinVer вернёт 1, иначе вернёт 0.

Применение простое - вызываем его тогда, когда надо выполнить как-то операции только если версия ОС не ниже чем заданная, а используя инверсную логику по отношению к интерпретации его кода возврата, можно его применять и для проверки условия не "Версия ОС не выше чем", но тогда Ваш код должен срабатывать по значению возвращаемой переменной равной 0.

Вызов:

в заголовоке скрипта должно стоять

!include "ProcLib.nsh"
<Ваш код>
${MinVer} <порог> <переменная>
<Ваш код>
порог две цифры номера версии, например для Win2k - 50, для WinXP - 51, для Vista - 60, ...
<переменная> - любая переменная куда будет помещён ответ, кроме регистров $R0 - $R2

Полноценное обновление будет, но чуть позже по времени - есть срочные дела.

jekov

Вот в этом углу смотри: ReserveFile "${NSISDIR}\Plugins\InstallOptions.dll" ReserveFile "test.ini" - менно там и прячется проверяемый пароль. А вот MUI как оболчка в данном случае тупиковый путь для анализа примера.
Автор: jekov
Дата сообщения: 12.03.2010 13:26
Victor_VG
в ini отсуствует Verify your serial,меняя значения в ini не меняют установку пароля,хотя и сам автор утверждает то же самое?!
Автор: Victor_VG
Дата сообщения: 12.03.2010 14:07
jekov

Честно скажу, не присматривался - сейчас просто времени на это нет. Глянул "в дагональ", нашёл этот кусок, показал на него. Но, в принципе есть плагины отвечающие за ввод-вывод паролей серийников. По моему Password, посмотри их там же в списке плагинов.
Автор: jekov
Дата сообщения: 14.03.2010 22:03
Знатоки,посоветуйте какой нибудь бесплатный способ криптирования типа PassDialog,скомпилировать собственную библиотеку алгоритма.Спасибо!
Автор: Victor_VG
Дата сообщения: 14.03.2010 22:43
jekov

В плагинах смотри, там что-то помню было.
Автор: kot280379
Дата сообщения: 19.03.2010 15:31
Подскажите пожалуйста,как реализовать выбор одного компонента исключающий выбор других компонентов в пределах одной секционной группы компонентов? т.е когда отметишь группу А, отмечаются два компонента или все, а нужно только один компонент или снять все компонеты в пределах одной секционной группы компонентов. скрипт:

!include "Sections.nsh"

Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user

Page components

SectionGroup /e A
;file
Section "Компонент №1" ID_1
SectionEnd

Section /o "Компонент №2" ID_2
SectionEnd

Section /o "Компонент №3" ID_3
SectionEnd

SectionGroupEnd

Function .onSelChange

; Выбор между компонентам 1, 2, 3
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_1}
!insertmacro RadioButton ${ID_2}
!insertmacro RadioButton ${ID_3}
!insertmacro EndRadioButtons

FunctionEnd

Function .onInit

StrCpy $1 ${ID_1}

FunctionEnd
Автор: Victor_VG
Дата сообщения: 21.03.2010 11:25
Обновил своё издание - Update for NSIS 2.4.6 v1.0.0.2

Что нового?

Плагины подновились, раз, и дописал наконец задуманное в ProcLib: теперь она умеет делать ещё пару нужных проверок: MinVer и RngVer. Смысл: первая проверяет что версия ОС не меньше заданной, а вторая проверяет что версия ОС лежит в диапазоне от нижней до верхней границы. Если условие ИСТИНА, то функции вернут "1", иначе значение кода возврата по умолчанию "0". Подробности описаны в документации на библиотеку, и под ковриком из-за размера.

[more=Новые функции в библиотеке ProcLib V2.6]MinVer
------

This function is simply detected OS version, compared to _mimver and returned "1" if OS version eqvalents or highest then requiremens, or "0" if letter in to users variables _retn

Parameters:

_minver - minimal version, two digits, example 51
_retn - user variables for returned results, exclude registers $R0 - $R2

Rescriptions:

Your can't use register $R0 - $R2 as _retn variables

Examples:

; added on to script header:

...
!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${MinVer} 51 $s1
...
SectionEnd

RngVer
------

This functions gets the operating system version and service pack number,
checks whether it is in the range _minver and _maxver, and if the version
of the system with installed service pack number, located in the specified
range, it returns "1" in the variable _retn, in other cases it returns "0".

Parameters:

_minver - min version and service pack number, always free digits, example 510
_minver - max version and service pack number, always free digits, example 513
_retn - user variables for returned results, exclude registers $0 and $1

Notes: if any digits not existing You mast replace this symbol use "0" digit.

Rescriptions:

Your can't use register $0 - $1 as _retn variables

Examples:

var s1

...

${RngVer} 501 513 $s1

; added on to script header:

...
!include "ProcLib.nsh"
var s1
...

Section "Code"
...
${RngVer} 500 619 $s1
...
SectionEnd

Detect OS version and service pack number then check that OS is Windows 2000 or
Windows XP/2003, or Windows Vista/2008, or Windows 7/2008 R2 and return "1" if
true. Else this function returned "0" if comparison is failure.[/more]

Важно! Только учтите, что для RngVer номер версии состоит из трёх цифр: мажор, минор, сервис пак, и именно в такой последовательности! Если сервис пак не важен, или его нет, то 3-я цифра должна быть нулём. Иначе код возврата функции всегда даст "0", т.е. условие будет считаться не выполненным.

jekov

Как раз обновлял плагины, поглядел - пока в репозитарии такого плагина нет, но он в разработке у одного из авторов. По словам того человека состояние на данный момент на уровне идеи алгоритма.

Автор: kot280379
Дата сообщения: 21.03.2010 14:00
Victor_VG помогите пожалуйста в моем вопросе постом выше. Заранее благодарен
Автор: Victor_VG
Дата сообщения: 21.03.2010 14:27
kot280379

Я для этого раскидываю нужные компоненты по группам и ставлю ряд проверок на логических переключателях. Но у меня обычно используются большие группы компонентов, иногда это сотни файлов. В принципе всё описано в Справке через свойства секций.
Автор: kot280379
Дата сообщения: 21.03.2010 16:44
Что то вроде так :

Код:
!include "Sections.nsh"
!include "MUI.nsh"

!define MUI_COMPONENTSPAGE_SMALLDESC

RequestExecutionLevel admin

!insertmacro MUI_PAGE_COMPONENTS

Name "Section"
OutFile "section.exe"


SectionGroup /e A

Section "test1" section1
SectionEnd

Section /o "test2" section2
SectionEnd

Section /o "test3" section3
SectionEnd
SectionGroupEnd

Function .onSelChange
SectionGetFlags ${section1} $1
SectionGetFlags ${section2} $2
SectionGetFlags ${section3} $3
StrCmp $1 "1" 0 N1
SectionGetFlags ${section2} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section2} $0
SectionGetFlags ${section3} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section3} $0
N1:

StrCmp $2 "1" 0 N2
SectionGetFlags ${section1} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section1} $0
SectionGetFlags ${section3} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section3} $0
N2:

StrCmp $3 "1" 0 N3
SectionGetFlags ${section1} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section1} $0
SectionGetFlags ${section2} $0
IntOp $0 $0 & ${SECTION_OFF}
SectionSetFlags ${section2} $0
N3:
FunctionEnd
Автор: Victor_VG
Дата сообщения: 21.03.2010 20:44
kot280379

Нет, нужен специальный макрос. Пример можешь взять в каталоге /Examples/NSIS моего обновления. Там используется достаточно просто и надёжный механизм. Элементарно его сделать в HM NIS 2.03. Всё это добро с последними обновлениями лежит у меня на сервере в разделе NSIS. И не надо ломать голову - механизмы отработаны ещё до нас.
Автор: kot280379
Дата сообщения: 22.03.2010 00:07
спасибо
Автор: Victor_VG
Дата сообщения: 22.03.2010 02:26
kot280379

Не за что.

P.S.

в разделе File Managers установщик Far 2.0.1447 искать не надо - я его удалил из-за ошибок в коде самого Far.exe. Уже нашёл где, костыль приставил. Скомпилирую бинарник - выложу уже 2.0.1449. Far Group известил.
Автор: Victor_VG
Дата сообщения: 28.03.2010 03:08
Особенности получения номера версии в ОС Windows.

Ситуация: пакет обновлений (Сервис Пак) не установлен. Чем это грозит, и что мы должны сделать для устранения возможных ошибок?

Используем простой тестовый скрипт (пример 1):

Цитата:
Outfile test.exe
ShowInstDetails show
Section "main"
Version::GetWindowsVersion
Pop $0
Pop $1
Pop $2
Pop $3
Pop $4
DetailPrint "$$0 == $0"
DetailPrint "$$1 == $1"
DetailPrint "$$2 == $2"
DetailPrint "$$3 == $3"
DetailPrint "$$4 == $4"
SectionEnd

Его вызов в такой ситуации (использовалась ОС Windows 2000 в VirtualBox 3.14) даёт картину 1:



где мы видим состояние регистров:
R0 = 5 - версия системы, минор = 5, всё верно;
R1 = маджор, неопределённое значение - "мусор", а мы ждём получения значения "0";
R2 = номер сборки, билд = 2195, всё верно;
R3 = 3 = NT, тип платформы, WINNT, верно;
R4 = неопределённое значение, CSID не известен, т.к. сервис пак не установлен. Эти значения возвращаются функцией GetVersionEx() из Kernel32.dll, но согласно MSDN данная функция не всегда возвращает числовое значение, иногда ей возвращаемое значение не определено и именно данная неопределённость приводит к ошибкам. "Мусор" это тот случай когда возвращаемая функцией структура содержит не определённые значение.

Скорректируем их посредством следующего скрипта (пример 2):

Цитата:
Outfile test.exe
ShowInstDetails show
Section "main"
Version::GetWindowsVersion
Pop $0
StrCmp $0 "" +1 +2
StrCpy $0 0
Pop $1
StrCmp $1 "" +1 +2
StrCpy $1 0
Pop $2
StrCmp $2 "" +1 +2
StrCpy $2 0
Pop $3
StrCmp $3 "" +1 +2
StrCpy $3 0
Pop $4
StrCmp $4 "" +1 +2
StrCpy $4 0
DetailPrint "$$0 == $0"
DetailPrint "$$1 == $1"
DetailPrint "$$2 == $2"
DetailPrint "$$3 == $3"
DetailPrint "$$4 == $4"
SectionEnd

и повторно протестируем пример:



в итоге мы получим определённые значения всех элементов, так как там где функция вернула неопределённое значение мы сами поставили условный "0".

И в заключение, работа обоих скриптов и пример 1 и пример 2 при запуске в ОС Windows XP SP3:



Проверка под отладчиком (GNU GCC-4.4.1-TDM2(R4), отладчик gdb 7.1) подтвердила предположение, что функция GetVersionEx() возвращает в случае отсутствия пакета обновления или минорной части версии ОС неопределённое значение которое потом корректирует код ОС.

На основании полученных данных я обновил библиотеку ProcLib.nsh до версии 2.7 в которую включил необходимые операции предотвращения ошибок. Она уже доступна на моём файл-сервере по этой ссылке в составе обновления для NSIS 2.46 ANSI скачать update.exe (10,3 Mb, начинайте качать браузером, потом кидайте в любую качалку, докачка поддерживается). Выкладывать её отдельно в следствии привязки к другим элементам обновления я пока не планирую.


Автор: Dikxi
Дата сообщения: 15.04.2010 11:55
Хочу попросить у людей которые собирают с помощью NSIS портативные программы.Залейте пожалуйста любой рабочий скрипт для сборки Portable.Сам я не умею писать скрипты хочу попробовать разобраться на готовом примере.
Автор: Victor_VG
Дата сообщения: 15.04.2010 12:16
Dikxi

Не вопрос - http://filekeeper.org/download/victorvg/Source/SDK/far-2.0-portable-sdk.tar.lzma

архив gnu tar 1.22 + LZMA 9.12 (сжатие LZMA2), раздаю под лицензией GNU GPL 3.0. Изучай, но у меня есть плохая привычка - в готовых программах после их отладки я всегда удаляю комментарии - они прилично тормозят компиляторы. Извини, но у меня ещё с Assembler OS/360 и PL/1 и систем ЕС ЭВМ/БЭСМ-6/Эльбрус осталась эта привычка, никак не изживу.
Автор: Dikxi
Дата сообщения: 15.04.2010 12:22
Victor_VG Спасибо.Два дня в интернете искал не нашел.
Вопросы будут обращусь к вам.
Автор: Victor_VG
Дата сообщения: 15.04.2010 12:51
Dikxi

Пожалуйста. Алгоритм идеи расписан в теме по Far Manager, а там он реализован с использованием NSIS плагина Registry. Но, у него есть особенность - резервные копии надо сохранять в $TEMP иначе не получается. С батниками та же петрушка. Да и вдобавок плагин позволяет определить факт отсутствия/наличия ключа сам, а в батнике нужно вызывать дополнительные программы, окна которых надо скрывать. Плагин же выполняется в фоновом скрытом окне. Плюс - не мелькают лишние окна.
Автор: Dikxi
Дата сообщения: 15.04.2010 13:56
Что то до меня не доходит Как с помощью NSIS собрать портативную программу.
Этой ThinApp 4.0.4 умею собирать а NSIS даже представления не имею.
Автор: Astra55
Дата сообщения: 15.04.2010 15:07
Dikxi

Цитата:
Два дня в интернете искал не нашел.

Наверное, это был неправильный Инет
http://portableappz.blogspot.com/2009/05/tutorial-portable-with-nsis.html
Автор: Victor_VG
Дата сообщения: 15.04.2010 15:29
Astra55

Или просто Dikxi только начал осваивать инструмент. Вспомни нас когда мы начинали. Глаза разбегались за что хвататься?
Автор: Dikxi
Дата сообщения: 15.04.2010 15:37
Во ВО глаза в кучу.C чего начать?

Добавлено:
Astra55 Почитаем.
Покапаем
Автор: Victor_VG
Дата сообщения: 15.04.2010 15:42
Dikxi

С описания входного языка компилятора и Справки.
Автор: Dikxi
Дата сообщения: 15.04.2010 15:51
Victor_VG У меня есть Total Uninstall 5. Вчера пробовал сохранить reg файл из реестра что то он не хочет.Захожу Файл-Извлеч-Установленные приложения А он не хочет.


Добавлено:
Как всё запутано.Ужас.
Автор: Astra55
Дата сообщения: 15.04.2010 16:20
Dikxi
Для снимка/подготовки инсталляции, пока что ничего лучше Ashampoo Uninstaller не придумано. Во всяком случае, мне об этом ничего не известно. Сам пользуюсь уже много лет. Если знаете систему и реестр (в плане удаления ненужного мусора), то операция занимает очень мало времени. Потом хоть в NSIS, хоть в какой-нибудь свой инсталлятор.
Автор: Dikxi
Дата сообщения: 15.04.2010 16:25
Astra55 ThinApp хорошо снимки делает.Там и ключи реестра и файлы программы которую хотим собрать.Всё что нужно для сборки в NSIS.
Ashampoo Uninstaller я не пробовал у меня стоит Total Uninstall 5.2.0 rus

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

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


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