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

chites
21-04-2011, 10:36
Доброе время суток!!!
А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ??
Если использовать 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 в разделе плагины, там много плагинов идут с сырцами, попадаются и на делфи, но в основном на си.

А не подскажете можно ли как-то перейти на предыдущую страницу Инсталлятора при некорректном выполнении основной секции ?? »
в студию проблемный кусок скрипта, тогда возможно подскажу...
Со странички инсталляции вы уже никуда не вернетесь, только останов. Вам нужно определить условие, которое даст гарантию корректности отработки кода в секции, иначе - возврат на страничку компонентов, это условие должно проверяться, только при закрытии (переходе на стр.инсталляции) стр. компонетов.

chites
21-04-2011, 11:15
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

chites
21-04-2011, 11:36
в том то и дело, что это поле может быть и пустым ... а првильность его ввода я могу проверить только при выполнении самого скрипта, который выполняется у меня в главной секции

kotkovets
21-04-2011, 11:50
chites, Условия определите какие вам нужны, при которых код в секции отработает нормально, иначе я ничем не помогу, я вам привел пример, когда нужно обрабатывать условия

chites
21-04-2011, 11:58
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