|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Как сохранить статус CheckBox на кастомных страницах?
К примеру снимаю галочку с CheckBox и возвращаюсь на предыдущую страницу, потом обратно на следующую и галочка опять стоит. |
Отправлено: 15:08, 12-10-2023 | #2811 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Цитата AlekseyPopovv:
При создании страницы выставить статус галки из переменной. При выходе со страницы (leave-функция и onBack-колбэк) записать статус галки в переменную. Скрытый текст
ShowInstDetails show RequestExecutionLevel user InstallColors /windows InstallDir $TEMP Page components page custom OptionsSaveLoadTest OptionsSaveLoadTest_Leave Page directory Page instfiles instfiles_pre !include LogicLib.nsh !include nsDialogs.nsh !include Sections.nsh Var Option1 Var Option2 Var hOption1 Var hOption2 Section DetailPrint 'Exec mandatory section' SectionEnd Section /o '-Option 1' SecOpt1 DetailPrint 'Exec Option1 section' SectionEnd Section /o '-Option 2' SecOpt2 DetailPrint 'Exec Option2 section' SectionEnd Function OptionsSaveLoadTest nsDialogs::Create 1018 Pop $0 GetFunctionAddress $0 OptionsSaveLoadTest_OnBack nsDialogs::OnBack $0 ${NSD_CreateCheckbox} 0 0 100% 8u 'Option&1' Pop $hOption1 ${IfThen} $Option1 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption1 ${|} ${NSD_CreateCheckbox} 0 15u 100% 8u 'Option&2' Pop $hOption2 ${IfThen} $Option2 == ${BST_CHECKED} ${|} ${NSD_Check} $hOption2 ${|} nsDialogs::Show FunctionEnd Function OptionsSaveLoadTest_OnBack ${NSD_GetState} $hOption1 $Option1 ${NSD_GetState} $hOption2 $Option2 FunctionEnd Function OptionsSaveLoadTest_Leave Call OptionsSaveLoadTest_OnBack FunctionEnd Function instfiles_pre ${IfThen} $Option1 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt1} ${|} ${IfThen} $Option2 == ${BST_CHECKED} ${|} !insertmacro SelectSection ${SecOpt2} ${|} FunctionEnd Function .onInit StrCpy $Option1 ${BST_UNCHECKED} StrCpy $Option2 ${BST_UNCHECKED} FunctionEnd |
|
Отправлено: 22:57, 13-10-2023 | #2812 |
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать Всем хорошего дня.
Если на рабочем столе кликнуть правой кнопкой мыши, то там есть пункт "Обновить". Как эту команду прописать в NSIS? |
Отправлено: 14:38, 20-10-2023 | #2813 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать |
Отправлено: 16:18, 20-10-2023 | #2814 |
Ветеран Сообщения: 2371
|
Профиль | Отправить PM | Цитировать Подскажите пожалуйста, как средствами NSIS переконвертировать(сделать читабельной) последовательность символов (Unicode Escape), к примеру такого вида : \u0412\u0430\u043b\u0435\u043d\u0442\u0438\u043d ?
|
Отправлено: 12:32, 26-10-2023 | #2815 |
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Как победить подобную конструкцию?
!macro Test ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name" StrCmp $0 "My" YESREG 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name" StrCmp $0 "My" YESREG 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name" StrCmp $0 "My" YESREG 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name" StrCmp $0 "My" YESREG 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name" StrCmp $0 "My" YESREG 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name" StrCmp $0 "My" YESREG 0 DeleteRegKey HKLM "SOFTWARE\Classes\Prog" YESREG: DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog" !macroend Такая конструкция работает, но это ужас: !macro Test ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\1" "Name" StrCmp $0 "My" +12 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\2" "Name" StrCmp $0 "My" +10 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\3" "Name" StrCmp $0 "My" +8 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\4" "Name" StrCmp $0 "My" +6 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\5" "Name" StrCmp $0 "My" +4 0 ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\6" "Name" StrCmp $0 "My" +2 0 DeleteRegKey HKLM "SOFTWARE\Classes\Prog" DeleteRegKey /ifempty HKLM "SOFTWARE\Classes\Prog" !macroend |
Отправлено: 18:50, 26-10-2023 | #2816 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Цитата MKN:
пример
ShowInstDetails show RequestExecutionLevel user InstallColors /windows SetFont 'Fira Code Retina' 9 ChangeUI all '${MYNSISDIREXAMPLES}\Contrib\UIs\largelog.exe' !include LogicLib.nsh !include Util.nsh !define SetSystemPluginDestination `!insertmacro SetSystemPluginDestination ` !macro SetSystemPluginDestination gflag value !define ${gflag} ${value} !if ${value} == 's' !else if ${value} S== 'r0' !else if ${value} S== 'r1' !else if ${value} S== 'r2' !else if ${value} S== 'r3' !else if ${value} S== 'r4' !else if ${value} S== 'r5' !else if ${value} S== 'r6' !else if ${value} S== 'r7' !else if ${value} S== 'r8' !else if ${value} S== 'r9' !else if ${value} S== 'R0' !else if ${value} S== 'R1' !else if ${value} S== 'R2' !else if ${value} S== 'R3' !else if ${value} S== 'R4' !else if ${value} S== 'R5' !else if ${value} S== 'R6' !else if ${value} S== 'R7' !else if ${value} S== 'R8' !else if ${value} S== 'R9' !else !define /redef ${gflag} 's' !endif !macroend !define ChrW `!insertmacro ChrW ` !macro ChrW result int !ifndef CharConvertBuffer16Initialized !define CharConvertBuffer16Initialized Var /GLOBAL g_CharConvertBuffer16 System::Call '*(&i2)p.s' Pop $g_CharConvertBuffer16 !endif ${SetSystemPluginDestination} ${__MACRO__}SymbolDestination ${result} System::Call '*$g_CharConvertBuffer16(&i2 ${int})' System::Call '*$g_CharConvertBuffer16(&w1 .${${__MACRO__}SymbolDestination})' !if ${${__MACRO__}SymbolDestination} == 's' Pop ${result} !endif !undef ${__MACRO__}SymbolDestination !macroend !define StrUnicodeUnescape `!insertmacro StrUnicodeUnescape ` !macro StrUnicodeUnescape result str !if '${str}' != 's' Push '${str}' !endif ${CallArtificialFunction} StrUnicodeUnescape_ !if ${result} != 's' Pop ${result} !endif !macroend !macro StrUnicodeUnescape_ Exch $0 ; [in] EscapedUnicodeString / [out] UnescapedUnicodeString Push $1 ; / EscapedUnicodeString Push $2 ; Counter Push $3 ; GetChar Push $4 ; GetChar2 StrCpy $1 $0 StrCpy $0 '' StrCpy $2 -1 ${Do} IntOp $2 $2 + 1 StrCpy $3 $1 1 $2 ${IfThen} $3 == '' ${|} ${ExitDo} ${|} ${If} $3 == '\' IntOp $4 $2 + 1 StrCpy $4 $1 1 $4 ${If} $4 == 'u' IntOp $2 $2 + 2 StrCpy $3 $1 4 $2 IntOp $2 $2 + 3 ${ChrW} r3 0x$3 ${EndIf} ${EndIf} StrCpy $0 $0$3 ${Loop} Pop $4 Pop $3 Pop $2 Pop $1 Exch $0 !macroend Section StrCpy $1 '\u0412\u0430\u043b\u0435нт\u0438\u043d' DetailPrint '>> [$1]' ${StrUnicodeUnescape} $0 $1 DetailPrint "<< [$0]" Push $1 ${StrUnicodeUnescape} $0 s DetailPrint "<< [$0]" Push $1 ${StrUnicodeUnescape} s s Pop $0 DetailPrint "<< [$0]" SectionEnd |
|
Отправлено: 19:24, 26-10-2023 | #2817 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать Цитата AlekseyPopovv:
Возможные решения: 1. Применять функции. Параметры передавать нужно через стек. А также делать раздельные функции для install/uninstall или писать дополнительную логику для объявления функции в install и/или uninstall. 2. Применять вызов через ${CallArtificialFunction} (Util.nsh) Параметры передавать нужно через стек. Реализация через установку метки и Goto на неё делает невозможным воздействие на код макроса флагами извне отдельно на каждый вызов, но это скорее понадобится для создания библиотечных макросов со сложной логикой. 3. Добавить в качестве префикса к метке уникальное в пределах текущего вызова макроса значение. LogicLib.nsh использует такой метод (но в отличной от примера реализации). пример
!macro DigitIsOdd return value ; объявить префикс !define LABEL__ ${__MACRO__}.__LABEL__.${__COUNTER__} StrCmp '${value}' 1 ${LABEL__}YES 0 StrCmp '${value}' 3 ${LABEL__}YES 0 StrCmp '${value}' 5 ${LABEL__}YES 0 StrCmp '${value}' 7 ${LABEL__}YES 0 StrCmp '${value}' 9 ${LABEL__}YES 0 Goto ${LABEL__}NO ${LABEL__}YES: StrCpy ${return} 'yes' Goto ${LABEL__}EXIT ${LABEL__}NO: StrCpy ${return} 'no' ${LABEL__}EXIT: ; удалить префикс !undef LABEL__ !macroend 4. Изменить структуру кода, использовать LogicLib, если это возможно и не ухудшает читаемость кода. |
|
Отправлено: 20:55, 26-10-2023 | #2818 |
Ветеран Сообщения: 2371
|
Профиль | Отправить PM | Цитировать iglezz, - замечательно ! (и где такому "волшебству" учат ?
![]() Некоторые детали кода не оч. понятны... largelog.exe в моих дистр-ах NSIS отсутствует(нужен для лога-проверки ?) Почему на выходе три варианта ${StrUnicodeUnescape} - "[$0]" ? Будет ли декодироваться не кириллическая таблица символов ? |
Отправлено: 11:23, 27-10-2023 | #2819 |
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать MKN, Вся видимая сложность тут для ускорения и некоторых дополнительных плюшек. А так, тут нет никакой магии, только примитивный парсинг строки и знание, что с помощью плагина System можно преобразовывать код символа в символ и обратно.
Цикл в StrUnicodeUnescape_ очень простой, умеет обнаруживаь и преобразовывать последовательность \u#### в юникод-символ. Без каких либо дополнительных проверок на корректность читаемых данных. По хорошему, надо, как минимум, добавить проверку на то, что после '\u' есть ровно четыре символа, которые являются валидным hex-числом. largelog.exe - это мой специальный тестовый UI большего размера (230% оригинала) для дебага через DetailPrint. Три варианта демонстрируют возможность читать строку со стека и записывать результат в стек. Это может быть полезно в сочетании в вызовами WinAPI функций через System::Call. Декодируются все коды формата \u#### |
Отправлено: 14:21, 27-10-2023 | #2820 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
[архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|