Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Я вас ни чем не оскорблял, лучше бы высказал своё мнение об этом дизайнере!
kotkovets
14-05-2011, 12:39
своё мнение об этом дизайнере! »
до нормального релиза дизайнеру весьма далеко...
И такое впечатление сложилось, что писали люди не очень хорошо знающие NSIS.
Но все равно им огромное спасибо!
Сам подумывал написать подобный GUI - но знаний маловато пока в программировании .
wolkow70
15-05-2011, 09:45
kotkovets,
Доброго времени суток.
Не приходилось ли Вам пользоваться плагином NsisXML plug-in
Скачал , а как пользоваться не разберусь, так как на английском инструкция.
К примеру в файле настроек :
<Sounds>
E:\Program Files\Yandex\Punto Switcher\Sounds\typerus.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\typeeng.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\misprint.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\ru.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\en.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\reverse.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\switch.wav,E:\Program Files\Yandex\Punto Switcher\Sounds\replace.wav
</Sounds>
То есть, привязка к жесткому диску идет.
Хотелось бы заменить букву диска через $SysDrive
Пока не разобрался можно ли вообще так сделать...
NsisXML plug »
Cбой при чтении файла DxDiag. Вот тест для Windows Vista Ultimate: (http://nsis.sourceforge.net/Talk:NsisXML_plug-in_(by_Wizou))
wolkow70
16-05-2011, 11:25
Cбой при чтении файла DxDiag. Вот тест для Windows Vista Ultimate: »
Пока не понял, то или нет..
Мне нужно определенные секции отредактировать в имеющемся xml.
Скорее всего, речь должна идти об удалении значения секции, и замене ее новыми строками...
!macro AdjustConfigValue ConfigFile Key Value
DetailPrint "Config: adding '${Key}'='${Value}' to ${ConfigFile}"
nsisXML::create
nsisXML::load ${ConfigFile}
nsisXML::select "/configuration/appSettings/add[@key='${Key}']"
nsisXML::setAttribute "value" ${Value}
nsisXML::save ${ConfigFile}
!macroend
!insertmacro AdjustConfigValue "$INSTDIR\MyApp.exe.config" "ServiceURL" "http://127.0.0.1"
То есть это позволяет заменить значение секции в настройках ?
MyApp.exe.config »
здесь наименование xml файла?
"ServiceURL" »
Название секции?
"http://127.0.0.1" »
Новое значение?
Kelinmiir
19-05-2011, 08:45
Добрый день!
Есть инсталлер, в нем есть страничка выбора компонентов !insertmacro MUI_PAGE_COMPONENTS сами компоненты добавляются таким образом:
Section "$(^component1)" component1\Section
ExecWait '"$EXEDir\7za.exe" x "$EXEDir\myarchive.zip" -o"$INSTDIR" -y'
SetOverwrite on
SectionEnd
Т.е. сами компоненты это zip архивы которые лежат в одной папке с инсталятором. И все бы хорошо но на странице выбора компонентов не правильно указывается "вес" программы, т.к. архивы не включены в инсталятор то неважно какие галочки я расставил, "вес" программы всегда показывает один, подскажите как можно это исправить.
Здравствуйте, Kelinmiir
Для этого есть такая команда AddSize, прописывается она внутри секции, указывается размер файлов в Килобайтах, например
Section "TEST"
AddSize 500
; Для установки данного компонента необходимо 500 Кб свободного метса на диске
; *Данная команда добавляет указанный размер к размеру файлов, которые прописаны внутри секции для распаковки
SectionEnd
Добрый день!
Упражнялся в написании nsDialog, лучше начинать с чего нибудь простого но полезного.
Вот что получилось (http://rghost.ru/7006341)...
Прошу проверить и подправить пример или посоветовать в каком направлении двигаться.
kotkovets
19-05-2011, 16:05
sawe,
Ошибок в коде достаточно, зачем в секции обращаться к пустому стеку?
Установщик выкидывает флаг ошибки, а раз так то,часто команды зависимые от флага ошибки НЕ БУДУТ РАБОТАТЬ! Здесь и в других (по подобию конструкциях) - нет ни одной команды помещающие значения в стек, к стеку нужно обращаться тогда, когда там, что то есть!!!
${If} $Check2 = 1
WriteRegStr HKLM "${CodePage}" "1250" "c_1251.nls"
ReadRegStr $0 HKLM "${CodePage}" "1250"
DetailPrint "Код страницы 1250 равен $0"
Pop $0 ;j ненужная команда здесь! ИМХО!
Iferrors 0 +2 ;проверка на флаг ошибки
MessageBox MB_OK "error" IDOK
${EndIf}
Компиллятор пишет НЕ критическое предупреждение, возможно ли это обойти? »
А на кой вам здесь либа MultiUser.nsh и макрос !insertmacro MULTIUSER_INIT на ней завязан и предполагается наличие деинсталятора - поэтому предупреждение. Вообще эта либа рисует кастомную страничку, добавляет уровень прав и однопользовательский или многопользовательский режим работы установщика. Совершенно не нужный балласт в скрипте, тем более с одной страничкой. достаточно прописать в начале скрипта (тем более работает только в Win7) RequestExecutionLevel admin и все! В инсталляторах NSIS всегда по умолчанию выбран многопользовательский режим работы.
Спасибо учту!
На счёт очистки стека Pop $0, так это дурная привычка, скорее от паники (лучше пере бдеть, чем не до бдеть).
Вы недавно упоминали ...
Сам подумывал написать подобный GUI
Вы можете попытаться состыковаться с Victor_VG и вместе написать не новую прогу а плагин к NIS Edit.
Это было бы проще для начала и опыта набраться можно по более. И у вас появится возможность опередить
NSIS Dialog Designer (http://forums.winamp.com/showthread.php?t=329801), так как его подбивают на глупости (импорт формата INI) а не на доводку.
Доброго времени суток!
Соблаговолите помочь советом "любителю".
Познакомился со скриптами довольно давно (на примерах от Авторов NSIS), уже несколько лет иногда собираю то что сам себе и дочкам русифицирую и чем сам постоянно пользуюсь.
Вопрос возник давно, но всё никак не мог нигде найти внятных объяснений.
Сейчас много чего перечитал на Озоне, но пока тоже не нашел то что ищу:
Интересует проверка при установке - не установлена-ли уже старая/более новая версия устанавливаемой программы.
-Например оригинальный установщик NSIS перед установкой идёт в Реестр, проверяет, не стоит-ли более новая, или старая версия NSIS и предлагает переустановиться.
-В оригинале скрипта makensis.nsi (в папке с примерами) всё вроде прописано.
Пробую на той-же NSIS, - например стояла 2.15 , в разделе Uninstall реестра значится 2.15, пробую ставить их сборку 2.45 - она предупреждает, предлагает переустановиться. Проставляю номер версии в скрипте, всё упаковывается, но новый мой инсталлятор ничего не проверяет и молча всё перезаписывает... И корневую папку и Реестр.
-Ткните, пожалуйста носом что делаю не так?
-А если ещё подскажете возможно-ли прописывать в деинсталлятор команду принудительно убивать деинсталлируемую программу (если она запущена) - вообще мне мёд будет :-)
Стараюсь НАНОСИТЬ добро...
и ПРИЧИНЯТЬ пользу...
Чаще всего следует читать в реестре номер версии
ReadRegStr $0 HKLM "SOFTWARE\куст_реестра" "имя_параметра"
; в $0 - будет инфо о версии!
Или прочесть из INI файла
ReadINIStr $0 "$INSTDIR\Файл.ini" "Секция" "Имя"
; в $0 - будет инфо о версии!
Если исполняемый или DLL файл содержит номер версии
;Ваше определения!
!define VERSION 5.5.5.0 # версия. В скрипте будет выглялеть вот так ${VERSION}
!define APP_NAME "программа" # Имя программы. В скрипте будет выглялеть вот так ${APP_NAME}
;----------------!
GetDllVersion "$INSTDIR\XXX.exe" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $R1 "$R2.$R3.$R4.$R5"
; в $R1 - будет инфо о версии!
; дальше можно выполнить код с использованием $R1 , пример ниже
IfFileExists "$INSTDIR\XXX.exe" 0 +3
MessageBox MB_YESNO|MB_ICONEXCLAMATION "У вас уже установлена программа - ${APP_NAME} ${VERSION} \
$\nВы хотите удалить предыдущую версию ${APP_NAME} $R1" IDNO +3
IfFileExists "$INSTDIR\unins000.exe" 0 +3
ExecWait '"$INSTDIR\unins000.exe" /S _?=$INSTDIR' # удаление старой версии для InnoSetup инсталлятора!
GoTo noNext
; Ваш дальнейший код!
noNext:
Если исполняемый или DLL файл не содержит номера версии, поищите где он в файлах указан и прочтите его.
Чтобы убить файл или процесс, следует подходить творчески, прежде всего надо узнать какая сволочь его держит и потом выбрать решение.
Лучше всего узнать класс и придушить его, но для этого нужен отдельный софт
Пример, как по хамски придушить
ReserveFile "${NSISDIR}\Plugins\KillProcDLL.dll"
;----------------!
KillProcDLL::KillProc "explorer.exe" ; только в крайнем случае!
Убить запущенный процесс
;Ваше определения!
!define Unclose_1 "XXX.exe" ;- имя запущенного процесса!
;----------------!
ReserveFile "${NSISDIR}\Plugins\KillProc.dll"
;----------------!
return_1:
StrCpy $0 "${Unclose_1}"
KillProc::FindProcesses
StrCmp $1 "-1" wooops_1
StrCmp $0 "0" completed_1
Sleep 1500
MessageBox MB_ICONQUESTION|MB_YESNOCANCEL "У Вас в Трее всё ещё запущен ${Unclose_1} $\nЗавершить этот процесс сейчас?" IDYES +4 IDCANCEL +2
MessageBox MB_ICONINFORMATION|MB_OKCANCEL "Для продолжения деинстоляции следует выбрать 'Да'" IDOK +2
Abort
Goto return_1
StrCpy $0 "${Unclose_1}"
KillProc::KillProcesses
StrCmp $1 "-1" wooops_1
Goto completed_1
wooops_1:
Abort
completed_1:
sawe
Признателен за ответ
Я не программист, поэтому пока стараюсь переварить и попробую на скрипте NSIS
С Вашего позволения если что не допру письну в ПМ ?
wolkow70
24-05-2011, 12:06
Уважаемый kotkovets,
Воспользовался вашими рекомендациями по созданию генератора ответов. Собрал сборку.
Проблема вот в чем:
Формирую такой файл ответов:
[DIRECTORY]
ISTALLDIR=E:\Program Files\JetAudio
[Sections]
StartMenu=1
Desktop=1
QuickLaunch=1
AU=1
AMS=1
AMF=1
AIF=1
AIFF=1
AAC=1
AC3=1
APE=1
DTS=1
DMF=1
DBM=1
FLAC=1
F4A=1
FAR=1
IT=1
IMS=1
KAR=1
M4A=1
M4B=1
M4R=1
MID=1
MIDI=1
MKA=1
MP+=1
MP2=1
MP3=1
MPC=1
MPP=1
MTM=1
MT2=1
MOD=1
MED=1
MDL=1
M3U=1
M3U8=1
OFR=1
OFS=1
OGA=1
OGG=1
OKT=1
PLS=1
RA=1
PTM=1
RMI=1
SPX=1
SND=1
S3M=1
TAK=1
TTA=1
UMX=1
ULT=1
W64=1
WAV=1
WMA=1
WV=1
XM=1
669=1
Context=1
Программу ставлю в тихом режиме /S
Сама программа ставится нормально.
Секции :
StartMenu=1
Desktop=1
QuickLaunch=1
нормально отрабатывают, а вот файловые ассоциации не производятся. Хотя в ручном режиме проблем нет.
Секции для типов файлов однотипные :
Section "MP3" MP3
SectionIn 2 3 4
${GetSecWriteSucces} MP3
${If} $SUCCES_SECTION = 1
WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"
${EndIf}
SectionEnd
Для ярлыков примерно также, но работает. В чем дело не пойму...
Section "Ярлык на Рабочем столе" Desktop
SectionIn 1 2 3 4
${GetSecWriteSucces} Desktop
${If} $SUCCES_SECTION = 1
SetOutPath "$INSTDIR"
CreateShortCut "$Desktop\JetAudio.lnk" "$INSTDIR\JetAudio.exe"
${EndIf}
SectionEnd
Может подскажите в чем может быть дело?
kotkovets
24-05-2011, 12:53
Попробуйте так, если сообщение появится, значит секция отрабатывает, либо проблема в
SectionIn 2 3 4 - вероятно получается по умолчанию не отмечена секция, т.е расставьте флаги так, что бы эта секция была по умолчанию отмечена.
Section "MP3" MP3а
SectionIn 2 3 4
${GetSecWriteSucces} MP3
${If} $SUCCES_SECTION = 1
/*WriteRegStr HKCU "Software\Classes\.MP3" "" "jetAudio.ASSOC.Audio"*/
MessageBox MB_ICONINFORMATION|MB_OK "sec: MP3"
${EndIf}
SectionEnd »
wolkow70
24-05-2011, 14:24
Нет, сообщение не появлялось, зато появлялись сообщения из работающих секций ярлыков. Отсюда вывод: проблема была во флагах.
Попробовал везде выставить 1 2 3 4, и все нормально заработало.
Не понятно почему флаги на это влияют, ведь файл ответов я создаю в ручную, и сам выставляю галочки в чекбоксах?
Можно ли в тихом режиме подавить значение этих флагов, потому, что я хочу по умолчанию, наоборот, без ассоциаций?
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию?
kotkovets
24-05-2011, 15:46
Не понятно почему флаги на это влияют, ведь файл ответов я создаю в ручную, и сам выставляю галочки в чекбоксах? »
А че тут не понятного, флаги отметки влияют на выполнение определенных секций(снимают или выставляют отметки на чебоксах), а макрос только в отмеченной секции работает, если секция не выбрана по умолчанию в режиме установки - результат ясен, код в секции не выполняется.
Отсюда вывод: принудительно в тихом режиме, командами устанавливать все
секции в отмеченное состояние - далее читается файл конфигурации и от его ответов зависит, что ставить, а что нет.
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »
а это ваша проблема в скрипте, ИМХО
здраствуйте.
Нужна опять ваша помощь
Интересует страница лицензии.
используеться
!insertmacro MUI_PAGE_LICENSE "nsis/license.txt"
Воопрос собственно в чем.
сейчас дя создания страницы лицензии файл license.txt должен уже существовать локально, до процесса компиляции.
мне же требуется что бы строка была типа такой
!insertmacro MUI_PAGE_LICENSE "$PLUGINSDIR/license.txt"
или
!insertmacro MUI_PAGE_LICENSE "$TEMP/license.txt"
Те что бы файл лицензии подтягивался уже на стороне пользователя.
На сколько это реально осуществить?
PS сам спросил сам отвечу, вдруг кому надо будет.
есть плагин который это позволяет сделать
http://nsis.sourceforge.net/CustomLicense_plug-in
в ветке обсуждения плагина также приводят пример
http://nsis.sourceforge.net/External_License_file
Работают оба варианта.
wolkow70
24-05-2011, 17:21
Понял, что моя ошибка заключалась в том, что я по умолчанию поставил "минимальный" тип установки. Переделал на "полный" тип, и все с ассоциациями наладилось.
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »
а это ваша проблема в скрипте, ИМХО »
А вот тут не разберусь, у меня так:
Section "!${PRODUCT_NAME}" Install
SectionIn 1 2 3 4 RO
${If} $GMODE = 0
${AndIf} ${Silent}
${AndIf} ${FileExists} "$INIFILE"
ClearErrors
ReadINIStr "$R0" "$INIFILE" "DIRECTORY" "ISTALLDIR"
${WordReplace} $R0 "%programfiles%" "$PROGRAMFILES" "+" $R1
${WordReplace} $R1 "%windir%" "$WINDIR" "+" $R0
${WordReplace} $R0 "%appdata%" "$APPDATA" "+" $R1
${WordReplace} $R1 "%systemdrive%" "$SysDrive" "+" $R0
StrCpy $INSTDIR $R0
${EndIf}
SetOutPath "$INSTDIR"
File "${pkgdir}\JetAudio\_fileext.dll"
File "${pkgdir}\JetAudio\_fileext.RUS"
File "${pkgdir}\JetAudio\_fileext2.dll"
и далее как всегда...
wolkow70
24-05-2011, 19:44
kotkovets
В общем, что получается?..
Выполняются все комманды в секции "!${PRODUCT_NAME}" после ${EndIf} и до конца секции, в том числе:
1. Копируются файлы;
2. Регистрируются dll;
3. Вносятся записи в реестр...
Посмотрел в скрипте AIMP, там так:
StrCpy $INSTDIR $R0
NotSilent:
SetOutPath "$INSTDIR\"
то есть у них вместо EndIf используется NotSilent: Но при этом у них макрос несколько иной...
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC