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

» NSIS (Nullsoft Scriptable Install System)

Автор: Victor_VG
Дата сообщения: 05.06.2014 23:59
FanIT

Или входные скрипты были в формате старого REGEDIT4. UNICODE скрипты 5-й версии сия утилита не сильно жалует.
Автор: MKN
Дата сообщения: 06.06.2014 09:49
FanIT

Цитата:
Есть какой-нибудь аналог утилите reg2nsis?

Есть занятная утилитка от китайских товарищей - reg2nsi. Причём с исходным кодом на NSIS, который можно при желании подкорректировать....
http://yadi.sk/d/a30kuf8TSTMce
Автор: FanIT
Дата сообщения: 06.06.2014 13:23
MKN
Спасибо! Получше. Хоть полностью reg файл конвертирует.
Автор: FanIT
Дата сообщения: 03.07.2014 21:55
Всем привет! Подскажите пожалуйста. Мне нужно, чтобы при изменение в инсталляторе пути установки, прибавлялась еще папка.
Например: пользователь указал диск D. Значит инсталлятор должен установить программу в D:\MyProgram.
Использую стандартную форму MUI_PAGE_DIRECTORY
Автор: Victor_VG
Дата сообщения: 04.07.2014 02:36
FanIT

ППР:

InstallDir "$PROGRAMFILES\MyDir"

если пользователь решит добавить ещё один каталог, отсчёт пойдёт от указанного пути.
Автор: FanIT
Дата сообщения: 04.07.2014 14:21
Victor_VG
Нет. Я наверно не правильно объяснил. Пользователь нажимает на кнопку обзор, выбирает папку установки, например диск D и нажимает сохранить. И в строке где указывается путь установки должно быть D:\MyDir. Может есть какое-то событие. Которое при измение пути установки вызывалась бы определенная функция.
Автор: Victor_VG
Дата сообщения: 04.07.2014 14:29
FanIT

В стандартных стабах v2.46 такого нет, но путь заданный в коде допишется. Для использования обзора надо плагин писать.
Автор: MKN
Дата сообщения: 04.07.2014 14:56
FanIT


Цитата:
Пользователь нажимает на кнопку обзор, выбирает папку установки, например диск D и нажимает сохранить. И в строке где указывается путь установки должно быть D:\MyDir.

Сделай собственную страницу с обзором, с помощью nsDialogs и не ломай голову.
Автор: FanIT
Дата сообщения: 04.07.2014 15:02
MKN
Так и сделаю. Просто думал есть стандартный способ.
Автор: MKN
Дата сообщения: 04.07.2014 15:23
FanIT

Цитата:
думал есть стандартный способ.

можно повозиться, взяв за основу :

Цитата:
!include MUI.nsh
OutFile "MyDir.exe"
;InstallDir "$TEMP"

!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowDirectoryPage
!insertmacro MUI_PAGE_DIRECTORY

Function ShowDirectoryPage
FindWindow $R0 "#32770" "" $HWNDPARENT
GetDlgItem $R1 $R0 1019
SendMessage $R1 ${WM_SETTEXT} 0 "STR:$INSTDIR\MyDir"
FunctionEnd

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Section
SectionEnd

только с корневыми дисками почему то не срабатывает. Я не возился, т.к. это полный изврат...
Автор: Sanch8
Дата сообщения: 01.09.2014 15:18
Подскажите как добавить многостроковый текст в MessageBox ?
При таком варианте выводится только последняя строка:


Код: Function Help
GetTempFileName $R0 ;Создаём временный файл в папке Temp
File /oname=$R0 filelist.txt :Сам файл
FileOpen $R1 $R0 r ; Открываем его
FileRead $R1 $R2 ;Чтение строк в переменную $R2
FileClose $R1 ; Закрываем файл
Delete /REBOOTOK $R0 ;Удаляем временный файл
System::Call 'user32::MessageBoxTimeout(i$HWNDPARENT,t"$R2",t"Инфо",i0x40, i 0, i 6000)' ;Выводим $R2 в MessageBox
FunctionEnd
Автор: Victor_VG
Дата сообщения: 01.09.2014 15:38
Sanch8

Вставьте $\n в нужные места. Вот вам пример из реального кода:

Цитата:
MessageBox MB_OK|MB_ICONSTOP "Извините, но возникла системная ошибка с кодом $R0 и Установка прервана.$\nПожалуйста, обратитесь к Администратору для решения этой проблемы." IDOK +2

И прочитайте подраздел Variables справки по NSIS. Эти переменные там перечислены.
Автор: Sanch8
Дата сообщения: 01.09.2014 16:14
Victor_VG
$\n
$\r$\n
Это понятно. Но мне нужно чтобы текст выводился в MessageBox как в самом файле т.е:
Строка 1
Строка 2
И вся инфа копировалась из txt файла в MessageBox
Автор: Victor_VG
Дата сообщения: 01.09.2014 16:30
Sanch8

Тогда вам нужно форматировать текст своим плагином. Насколько я помню, готового вроде и нет.
Автор: Sanch8
Дата сообщения: 01.09.2014 18:41
Нашёл решение, вот код:

Код: Function Help
GetTempFileName $R0
File /oname=$R0 filelist.txt
FileOpen $0 $R0 r
System::Call 'kernel32::GetFileSize(ir0, i0) i .r1'
IntOp $1 $1 + 1
IntCmp $1 ${NSIS_MAX_STRLEN} 0 0
System::Alloc $1
Pop $2
System::Call 'kernel32::ReadFile(ir0, ir2, ir1, *i.r3, i0)'
FileClose $0
System::Call "*$2(&t$3.r4)"
   System::Call 'user32::MessageBoxTimeout(i$HWNDPARENT,t"$4",t"Инфо",i0x40, i 0, i 6000)'
System::Free $2
   Delete /REBOOTOK $R0
FunctionEnd
Автор: Victor_VG
Дата сообщения: 01.09.2014 18:44
Sanch8

Так, да получится, заметьте, не через сам NSIS, а через WinAPI который собственно и парсит строки по Cr-Lf.
Автор: Talula41
Дата сообщения: 02.10.2014 06:58
вопрос возможно не по теме, извините, если не туда
есть готовый инсталлятор. разбирать, собирать и т.д. не вариант. надо, чтобы временные файлы помещались в определённую папку. скажем, c:\temp, а не в системную папку. можно ли сделать это через параметры командной строки?
Автор: MKN
Дата сообщения: 02.10.2014 12:45
Talula41

Цитата:
надо, чтобы временные файлы помещались в определённую папку. скажем, c:\temp, а не в системную папку. можно ли сделать это через параметры командной строки?

SET TEMP=C:\TEMP
после установки, вернуть обратно
Автор: Talula41
Дата сообщения: 02.10.2014 14:09

Цитата:
SET TEMP=C:\TEMP
после установки, вернуть обратно


я не про это. инсталлятор можно запустить с помощью параметров, например /NCRC
темп папка конкретного инсталлятора, которая создаётся внутри системной темп и имеет вид ns****.tmp
есть файл, который извлекается инсталятором туда. это некая проверка после которой начинается установка. есть этот подправленый файл. если его поместить в эту папку, то инсталятор не извлекает оригинал, а юзает этот. вот собственно надо сделать так, чтобы с запуском инсталлятора создавалась своя временная папка, в которую можно поместить этот файл. как задать параметр и положить файл - дело другое и труда не составляет. интересует сам параметр.
Автор: MKN
Дата сообщения: 02.10.2014 14:58
Talula41

Цитата:
надо сделать так, чтобы с запуском инсталлятора создавалась своя временная папка

Попробуй использовать функцию SetEnvironmentVariable.
Вообще ты как то сумбурно объясняешь... Кусок бы кода привёл и указал в каком месте что необходимо...
Автор: Talula41
Дата сообщения: 03.10.2014 13:08

Цитата:
Попробуй использовать функцию SetEnvironmentVariable.

инсталлятор уже готов. он НЕ мой. если я его собирал, то просто положил бы подправленный файл.
короче, объясняю как могу =) есть готовый setup.exe
при запуске появляется окно выбора языка. в этот момент уже существует папка C:\Users\имя_юзера\AppData\Local\Temp\nse7CBC.tmp, в которой есть три файла: LangDLL2.dll, System.dll, UserInfo.dll. после выбора языка надо подключить определённое оборудование к компу и нажать далее. в этот момент появляются ещё несколько файлов в том числе и dll отвечающая за проверку этого оборудования. если его нет - установка невозможна. этот файл я подправил и установка спокойно продолжается. инсталятор не перезаписывает файлы. т.е. если он уже есть в папке - используется он. таким образом ещё на стадии выбора языка можно подложить свой файл и спокойно установить прогу без лишних манипуляций.
проблема в том, что имя папки всегда разное. пересобирать инсталятор не вариант. поэтому и интересует команда. в inno setup инсталляторах задать временную папку готовому инсталлятору можно через параметры запуска. поэтому и спрашиваю.
по идее, устроит даже вариант, чтобы все файлы извлекались рядом с инсталятором, т.к. он всё равно будет в темпе.

з.ы. если команды такой не существует, то есть ли возможность перехватить имя этой папки на стадии её создания?
Автор: Victor_VG
Дата сообщения: 03.10.2014 13:24
Talula41

Имя перехватить нельзя, но указать распаковку в $PLUGDIR можно. Или написать свой инсталлер. Вариант номер три - не лезть как слон в посудную лавку.
Автор: Talula41
Дата сообщения: 03.10.2014 13:53

Цитата:
Имя перехватить нельзя, но указать распаковку в $PLUGDIR можно.

дело не в перепаковке или создании сетапа в другом инсталяторе - это дело 5 минут. тут дело принципа (долго объяснять смысл просто). но сам инсталятор должен остаться оригинальным.
Автор: Victor_VG
Дата сообщения: 03.10.2014 14:32
Talula41

Тоды ручками. Вам ответили, больше тут добавить нечего...
Автор: Talula41
Дата сообщения: 03.10.2014 14:40
Victor_VG
понял, спасибо =)
Автор: MKN
Дата сообщения: 03.10.2014 14:59
Talula41
Т.е. нужно отследить появление (или наличие ? ) конкретного файла в папке с переменным названием и в зависимости от результата сделать нечто ?
Если так, то это просто. Если установить наличие файла в любой директории( с любым названием ), которая создаётся инсталлятором в $TEMP, то это обыкновенное :

${Locate} "$TEMP" "/L=F /M=my.dll" "search"
Function search
StrCpy $R0 $R9
MessageBox MB_YESNO '$R0$\n$\nИскать дальше?' IDYES +2
StrCpy $0 StopLocate
Push $0
FunctionEnd

Если ждать появления файла в неизвестной директории , то используем поиск в цикле...
Автор: Talula41
Дата сообщения: 03.10.2014 15:51
MKN
вы опять предлагаете мне решение при создании инсталятора, но оно бессмысленно...
Автор: MKN
Дата сообщения: 03.10.2014 15:55
Talula41
Твой инсталлятор останется не тронутым. А запустится скрипт, который запустит и твой инсталлятор и отследит всё что нужно... Ну, если не нравится, как хочешь...
Автор: Talula41
Дата сообщения: 03.10.2014 16:02
MKN
но этот скрипт для чего? для nsis, так ведь? это явно не для командной строки...
блин, интересовала такая возможность "setup.exe /TMPDIR=C:\123tmp"
команда несуществующая, вписал для наглядности. но как оказалось такой вариант не канает. всё, спасибо за советы, вопрос закрыт =)
Автор: nil998
Дата сообщения: 27.11.2014 15:18
Victor_VG
Где можно скачать вашу сборку NSIS2.46 (кроме трекера)?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

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


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