PDA

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


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

sawe
14-05-2011, 12:25
Я вас ни чем не оскорблял, лучше бы высказал своё мнение об этом дизайнере!

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
Пока не разобрался можно ли вообще так сделать...

sawe
15-05-2011, 23:35
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 архивы которые лежат в одной папке с инсталятором. И все бы хорошо но на странице выбора компонентов не правильно указывается "вес" программы, т.к. архивы не включены в инсталятор то неважно какие галочки я расставил, "вес" программы всегда показывает один, подскажите как можно это исправить.

K.A.V.
19-05-2011, 11:01
Здравствуйте, Kelinmiir
Для этого есть такая команда AddSize, прописывается она внутри секции, указывается размер файлов в Килобайтах, например

Section "TEST"
AddSize 500
; Для установки данного компонента необходимо 500 Кб свободного метса на диске
; *Данная команда добавляет указанный размер к размеру файлов, которые прописаны внутри секции для распаковки
SectionEnd

sawe
19-05-2011, 12:13
Добрый день!
Упражнялся в написании 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 всегда по умолчанию выбран многопользовательский режим работы.

sawe
19-05-2011, 19:12
Спасибо учту!
На счёт очистки стека Pop $0, так это дурная привычка, скорее от паники (лучше пере бдеть, чем не до бдеть).

Вы недавно упоминали ...
Сам подумывал написать подобный GUI
Вы можете попытаться состыковаться с Victor_VG и вместе написать не новую прогу а плагин к NIS Edit.
Это было бы проще для начала и опыта набраться можно по более. И у вас появится возможность опередить
NSIS Dialog Designer (http://forums.winamp.com/showthread.php?t=329801), так как его подбивают на глупости (импорт формата INI) а не на доводку.

Valdise
20-05-2011, 14:09
Доброго времени суток!
Соблаговолите помочь советом "любителю".
Познакомился со скриптами довольно давно (на примерах от Авторов NSIS), уже несколько лет иногда собираю то что сам себе и дочкам русифицирую и чем сам постоянно пользуюсь.
Вопрос возник давно, но всё никак не мог нигде найти внятных объяснений.
Сейчас много чего перечитал на Озоне, но пока тоже не нашел то что ищу:

Интересует проверка при установке - не установлена-ли уже старая/более новая версия устанавливаемой программы.

-Например оригинальный установщик NSIS перед установкой идёт в Реестр, проверяет, не стоит-ли более новая, или старая версия NSIS и предлагает переустановиться.
-В оригинале скрипта makensis.nsi (в папке с примерами) всё вроде прописано.
Пробую на той-же NSIS, - например стояла 2.15 , в разделе Uninstall реестра значится 2.15, пробую ставить их сборку 2.45 - она предупреждает, предлагает переустановиться. Проставляю номер версии в скрипте, всё упаковывается, но новый мой инсталлятор ничего не проверяет и молча всё перезаписывает... И корневую папку и Реестр.

-Ткните, пожалуйста носом что делаю не так?

-А если ещё подскажете возможно-ли прописывать в деинсталлятор команду принудительно убивать деинсталлируемую программу (если она запущена) - вообще мне мёд будет :-)

Стараюсь НАНОСИТЬ добро...
и ПРИЧИНЯТЬ пользу...

sawe
20-05-2011, 16:13
Чаще всего следует читать в реестре номер версии

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:

Valdise
21-05-2011, 20:30
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
Не понятно почему флаги на это влияют, ведь файл ответов я создаю в ручную, и сам выставляю галочки в чекбоксах? »
А че тут не понятного, флаги отметки влияют на выполнение определенных секций(снимают или выставляют отметки на чебоксах), а макрос только в отмеченной секции работает, если секция не выбрана по умолчанию в режиме установки - результат ясен, код в секции не выполняется.
Отсюда вывод: принудительно в тихом режиме, командами устанавливать все
секции в отмеченное состояние - далее читается файл конфигурации и от его ответов зависит, что ставить, а что нет.
И еще проблема, во время создания файла ответов, идет распаковка файлов в директорию. Можно ли сделать только эмуляцию? »
а это ваша проблема в скрипте, ИМХО

yyv
24-05-2011, 15:55
здраствуйте.
Нужна опять ваша помощь
Интересует страница лицензии.
используеться
!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