|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 |
|
Ветеран Сообщения: 2398
|
Профиль | Отправить 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 | |
|