Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Доброе время суток!!!
А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ??
Если использовать Abort, отображается текущая страница с активной кнопкой "Отмена", а мне бы хотелось, чтобы инсталлятор перешел на предыдущуб страницу, ну или хотябы была активна кнопка еще "Назад"
kotkovets
21-04-2011, 10:46
Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си? »
можно и на делфи, не важно, но лучше все таки на си, потому что, NSIS си-подобный язык, даже больше смахивает на Visual Basic.
System::Call "Crypt::Code($R1) $R2" »
Здесь в корне не правильный синтаксис, но не значит, что будет работать. По сути передаются строковые значения, при такой записи предполагается, что Crypt лежит в system32, $R1 -пишется как R1, что типа так:
System::Call "путь\Crypt::Code(t.R1, t.R2)i.r0"
i.r0 - код возврата в $0 (переменная типа int, 0 или error (вообще, код возврата можно определить в библиотеке, error - возвращает system.dll - успешно или нет)
Здесь я вам не помогу в написании плагина , к сожалению...
О синтаксе System почитайте Docs\System\System.html и о типах переменных. Посмотрите на сайте NSIS в разделе плагины, там много плагинов идут с сырцами, попадаются и на делфи, но в основном на си.
А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ?? »
в студию проблемный кусок скрипта, тогда возможно подскажу...
Со странички инсталляции вы уже никуда не вернетесь, только останов. Вам нужно определить условие, которое даст гарантию корректности отработки кода в секции, иначе - возврат на страничку компонентов, это условие должно проверяться, только при закрытии (переходе на стр.инсталляции) стр. компонетов.
Page custom fnCustomInit fnCustomDestroy
!insertmacro MUI_PAGE_INSTFILES
Function fnCustomInit
!insertmacro MUI_HEADER_TEXT "Инициализация SQL-сервера" "Введите имя вашего SQL-сервера."
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateLabel} 0 5u 100u 10u "Имя SQL-сервера"
Pop $Label
${NSD_CreateText} 0 20u 100% 15u "SQLEXPRESS"
Pop $Text
nsDialogs::Show
FunctionEnd
Function fnCustomDestroy
${NSD_GetText} $Text $R0
FunctionEnd
Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite on
; Файлы для установки
File "upd4.sql"
StrCmp $R0 "" 0 +3
ExecWait '"$INSTDIR\DATA\osql.exe" -S . -E -d hls_hc -n -i "${FILE_SQL_NAME}" -u -o "log.txt"'
Goto +2
ExecWait '"$INSTDIR\DATA\osql.exe" -S .\$R0 -E -d hls_hc -n -i "${FILE_SQL_NAME}" -u -o "log.txt"'
FileOpen $R0 "$INSTDIR\log.txt" "r"
read:
Push $R0
Call FileReadUnicode
Pop $R1
Push $R1
Call Trim
Pop $Report
StrCmp $Report "1" done
StrCmp $Report "2" done
StrCmp $Report "3" done
StrCmp $Report '' 0 +4
MessageBox MB_OK "Проверьте правильность ввода имени Sql-сервера"
Abort
Goto done
Goto read
done:
FileClose $R0
SectionEnd
вот хочется чтобы в месте Abort инсталлятор вернулся бы к странице Page custom fnCustomInit fnCustomDestroy
kotkovets
21-04-2011, 11:29
chites,
Я так понял вам нужно, проверить правильность ввода имени Sql-сервера ?
Делается это в функции (в вашем fnCustomDestroy) при закрытии кастомной странички
К примеру, я в поле ввода имени, ничего не ввел...
Function fnCustomDestroy
${NSD_GetText} $Text $R0
${If} $R0 == "" #условие, если $R0 равно пустому значению, тогда...
MessageBox MB_ICONSTOP|MB_OK "Введите имя!"
Abort
${EndIf}
FunctionEnd
в том то и дело, что это поле может быть и пустым ... а првильность его ввода я могу проверить только при выполнении самого скрипта, который выполняется у меня в главной секции
kotkovets
21-04-2011, 11:50
chites, Условия определите какие вам нужны, при которых код в секции отработает нормально, иначе я ничем не помогу, я вам привел пример, когда нужно обрабатывать условия
kotkovets, спасибо за помощь и столь быстрые ответы!!! Значит я правильно понимаю, что нельзя после выполнения основной секции вернуться на предыдущую страницу? И здесь только один выход, держать пользователя на предыдущей странице пока не удостоверимся о правильности ввода? Это конечно проблематичнее (((
kotkovets
21-04-2011, 12:15
Значит я правильно понимаю, что нельзя после выполнения основной секции вернуться на предыдущую страницу? »
все верно! я бы перенес код из секции в функцию fnCustomDestroy :unsure:
Krinkels
21-04-2011, 13:35
Shukaj
Плагины к NSIS, если не ошибаюсь, пишутся на си. Получается, что придётся переписать dll-ку с делфи на си? »
Я писал плагин на дельфи(плагин для распаковки freearc архивов с отображением прогресса распаковки), и он прекрасно работает. Не важно на чем ты пишешь, важно чтоб плагин был написан правильно, иначе он просто не заработает.
wolkow70
21-04-2011, 17:48
Товарищи, делаю сборку Ligth Alloy прописал с ассоциациями такие команды:
StrCpy $OpenCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $PlayCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $QueneCommand "$INSTDIR\LA.exe $\"%1$\" /ADD"
"Воспроизвести в LA" работает
"Открыть в LA работает"
Открыть файл двойным щелчком не работает. Приходится ткнуть кнопку воспроизведения.
С оригинальным инсталлятором все работает.
Что нужно поправить?
kotkovets
21-04-2011, 19:31
wolkow70
А чем дело то? поставьте оригинал и гляньте какие записи делает, и перенесите такие же записи в свой установщик, а не за макросы сразу бросаться, научитесь для начала в реестр данные загонять в отладочном скрипте и сравниваете с оригиналом - пока не станут индетичны (заработает).
А то Вы сразу за штурвал МиГ-19 , минуя У-2
wolkow70
22-04-2011, 09:01
А чем дело то? поставьте оригинал и гляньте какие записи делает, и перенесите такие же записи в свой установщик, а не за макросы сразу бросаться, научитесь для начала в реестр данные загонять в отладочном скрипте и сравниваете с оригиналом - пока не станут индетичны (заработает). »
Ставил оригинал, сохранял рег-файл, конвертировал в скрипт, и все равно также. Видимо конвертор криво работает.... А сам я в этих долларах и процентах не могу разобраться. Тем более, что конвертор часто по разному выдает результат... именно применительно к синтаксису команд.
kotkovets
22-04-2011, 09:43
Ставил оригинал, сохранял рег-файл, конвертировал в скрипт, и все равно также. Видимо конвертор криво работает »
Вот с этого надо и начинать, приведите отснятый рег-файл.
А сам я в этих долларах и процентах не могу разобраться »
за одно и расскажу - для чего баксы и проценты. :)
wolkow70
22-04-2011, 10:10
kotkovets, Ну вот, к примеру для файлов MP4 с оригинальной инсталляцией, все нормально открывается.
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\.MP4]
@="LAV4.MP4"
"LA_Backup"="LAV4.MP4"
Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\LAV4.MP4]
@="Light Alloy - MPEG-4 Media File"
[HKEY_CLASSES_ROOT\LAV4.MP4\DefaultIcon]
@="E:\\Program Files\\Light Alloy 4.5up\\Icons\\XPlite.icl,36"
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell]
@="Play"
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Enqueue]
@="Добавить в список в Light Alloy"
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Enqueue\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\" /ADD"
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Open]
@=""
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Open\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\""
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Play]
@="Воспроизвести в Light Alloy"
[HKEY_CLASSES_ROOT\LAV4.MP4\Shell\Play\Command]
@="E:\\Program Files\\Light Alloy 4.5up\\LA.exe \"%1\""
[HKEY_CLASSES_ROOT\LAV4.MP4\shellex]
[HKEY_CLASSES_ROOT\LAV4.MP4\shellex\ContextMenuHandlers]
[HKEY_CLASSES_ROOT\LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu]
@="{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"
kotkovets
22-04-2011, 13:13
wolkow70,
Под боком конвертера нету, делал руками.
WriteRegStr HKCR ".MP4" "" "LAV4.MP4"
WriteRegStr HKCR ".MP4" "LA_Backup" "LAV4.MP4"
WriteRegStr HKCR "LAV4.MP4" "" "Light Alloy - MPEG-4 Media File"
WriteRegStr HKCR "LAV4.MP4\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\XPlite.icl,36"
WriteRegStr HKCR "LAV4.MP4\Shell" "" "Play"
WriteRegStr HKCR "LAV4.MP4\Shell\Enqueue" "" "Добавить в список в Light Alloy"
WriteRegStr HKCR "LAV4.MP4\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
WriteRegStr HKCR "LAV4.MP4\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKCR "LAV4.MP4\Shell\Play" "" "Воспроизвести в Light Alloy"
WriteRegStr HKCR "LAV4.MP4\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKCR "LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"
Но я обычно такие данный загоняю в HKLM.
WriteRegStr HKLM "SOFTWARE\Classes\.MP4" "" "LAV4.MP4"
WriteRegStr HKLM "SOFTWARE\Classes\.MP4" "LA_Backup" "LAV4.MP4"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4" "" "Light Alloy - MPEG-4 Media File"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\XPlite.icl,36"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell" "" "Play"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Enqueue" "" "Добавить в список в Light Alloy"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Play" "" "Воспроизвести в Light Alloy"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.MP4\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"
Синтаксис записи строковых параметров.
WriteRegStr [root_key] [subkey] [key_name] [value]
пример, записать в ключ значение Light Alloy
WriteRegStr HKLM "Software\My Company" "KEY" "Light Alloy"
Записать значение: "Light Alloy" /ADD - c вложенными кавычками, для этого есть символ $\"
WriteRegStr HKLM "Software\My Company" "KEY" "$\"Light Alloy$\" /ADD"
Можно так
WriteRegStr HKLM "Software\My Company" "KEY" '"Light Alloy" /ADD'
Или так
WriteRegStr HKLM "Software\My Company" "KEY" `"Light Alloy" /ADD`
%1 - в эту системную переменную подставляется путь\file, т.е вы кликаете по файлу и он открывается соответствующей программой.
Еще очень важное замечание про расширяемый строковый параметр, параметр типа REG_EXPAND_STR
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders]
"Common Desktop"=hex(2):25,00,41,00,4c,00,4c,00,55,00,53,00,45,00,52,00,53,00,\
50,00,52,00,4f,00,46,00,49,00,4c,00,45,00,25,00,5c,00,20,04,30,04,31,04,3e,\
04,47,04,38,04,39,04,20,00,41,04,42,04,3e,04,3b,04,00,00
Это проделки реестра, если импортируйте этот файл в реестр, то получите значение ключа Common Desktop равным %ALLUSERSPROFILE%\Рабочий стол
Так вот, если вы их конвертируете в скрипт NSIS, то получите значение ключа в бинарном ввиде, а в реестре смотрим - это же расширяемый строковый параметр, здесь очень важно смотреть, какой тип параметра!
Правильно будет так:
WriteRegExpandStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Common Desktop" "%ALLUSERSPROFILE%\Рабочий стол"
wolkow70
22-04-2011, 14:00
Я с такими параметрами и делаю:
;variables section
Var OpenCommand
Var PlayCommand
Var QueneCommand
в !macro RegisterExtension extenstion включаю:
WriteRegStr HKCR "$ClassName\Shell\Open\Command" "" "$OpenCommand"
WriteRegStr HKCR "$ClassName\Shell\Play\Command" "" "$PlayCommand"
WriteRegStr HKCR "$ClassName\Shell\Enqueue\Command" "" "$QueneCommand"
Section "-SetupIconsVariables"
StrCmp $gMode 1 NotgMode
;default icon file
StrCpy $IconFileName "XPlite.icl"
IfSilent 0 EndSection
IfFileExists $IniFile 0 EndSection
ReadINIStr $R0 $IniFile Advanced IconFileName
IfFileExists "$INSTDIR\Icons\$R0" 0 EndSection
StrCpy $IconFileName $R0
EndSection:
StrCpy $IconFile "$INSTDIR\Icons\$IconFileName"
StrCpy $OpenCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $PlayCommand "$INSTDIR\LA.exe $\"%1$\""
StrCpy $QueneCommand "$INSTDIR\LA.exe $\"%1$\" /ADD"
StrCpy $Exe_Path "$INSTDIR\LA.exe"
NotgMode:
SectionEnd
Результат один и тот же через двойной клик не открывается файл, хотя программа запускается, но к воспроизведению не переходит. С оригинальным инсталлятором работает.
Что характерно, через контекстное меню "Воспроивести в LA" файл проигрывается. То есть, именно двойной клик не срабатывает.
kotkovets
22-04-2011, 15:37
wolkow70
У меня все нормально работает, на примере LASetup_4.5.4_(build-603)
тем более там регистрируется библиотека ContextMenu.dll
OutFile File.exe
Section
WriteRegStr HKLM "SOFTWARE\Classes\.avi" "" "LAV4.AVI"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI" "" "Light Alloy - Audio-Video Interleaved Media File"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\DefaultIcon" "" "$PROGRAMFILES\Light Alloy 4.5up\Icons\PK69.icl,0"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell" "" "Play"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Enqueue" "" "Добавить в список в Light Alloy"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Enqueue\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\" /ADD"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Open\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Play" "" "Воспроизвести в Light Alloy"
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\Shell\Play\Command" "" "$PROGRAMFILES\Light Alloy 4.5up\LA.exe $\"%1$\""
WriteRegStr HKLM "SOFTWARE\Classes\LAV4.AVI\shellex\ContextMenuHandlers\LA5ContextMenu" "" "{45C15F61-ACAD-48C6-8D86-321ED8A6CFC6}"
;обновляем кэш иконoк
System::Call 'shell32::SHChangeNotify(i 0x08000000, i 0, i 0, i 0)'
SectionEnd
wolkow70
22-04-2011, 15:55
У меня версия LASetup_4.5.4_(build-603)_Standard.exe последняя с сайта.
Регистрацию библиотеки ContextMenu.dll я прописал так:
!include "Library.nsh"
Section "Контекстое меню проводника" ContextMenu
SectionIn 1 2
;read/write section state
!insertmacro ProcessSection "ContextMenu"
;if $r0 is 0 then exit section
StrCmp $R0 0 EndSection 0
;--------------section code----------------
${RefreshShellIcons}
RegDLL "$INSTDIR\ContextMenu.dll"
EndSection:
SectionEnd
Section Uninstall
!insertmacro UninstallLib REGDLL NOTSHARED NOREBOOT_PROTECTED "$INSTDIR\ContextMenu.dll"
Delete /REBOOTOK "$INSTDIR\ContextMenu.dll"
Эта библиотека при деинсталляции требует перезагрузки, что неудобно.
Я вообще за основу взял скрипт от AIMP и его перекраиваю.
kotkovets
22-04-2011, 16:11
wolkow70
Начинайте с с более простого, примеры я Вам привел, а вы сразу за аналог AIMP беретесь!
Эта библиотека при деинсталляции требует перезагрузки, что неудобно »
можно и без перезагрузки обойтись, перезапуском оболочки.
если не ошибаюсь, проводник должен перезапустится (настройка по умолчанию)
TASKKILL /F /IM explorer.exe
или плагином NsRestartExplorer plug-in (http://nsis.sourceforge.net/NsRestartExplorer_plug-in)
Иногда он сбоит на WIN 7, но очень редко.
У меня так в установщике 7-zip сделано.
wolkow70
22-04-2011, 16:24
Начинайте с с более простого, примеры я Вам привел, а вы сразу за аналог AIMP беретесь! »
Вы мне сами посоветовали обратить внимание на скрипт AIMP. А более простые вещи меня уже не интересуют, я уже 30 инсталляторов собрал, и теперь хочу сделать именно такую вещь.
Как я из вашего примера понял, Вы делаете ассоциации напрямую записями в реестре, а я пытаюсь использовать макрос из AIMP. И все работает, кроме открытия файлов двойным щелчком. Может и не в макросе дело? Ассоциации все производятся правильно. Проверял с официальной установкой.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC