Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
AlekseyPopovv
22-10-2019, 20:39
Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005... »
Да, придётся заморочиться.
Так какой смысл в этой "защите"? »
Я же не могу открыть такие инсталляторы...
habib2302
23-10-2019, 09:56
По ходу мне только одному не известный. »
Просто нужно знать в каком месте менять байты через hex редактор
AlekseyPopovv
23-10-2019, 20:24
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors} ; проверка ключа /I
MessageBox MB_OK "ключ /I есть"
${EndIf} ; проверка ключа /I завершена
ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors} ; проверка ключа /P
MessageBox MB_OK "ключ /P есть"
${EndIf} ; проверка ключа /P завершена
Quit
${EndIf} ; проверка на тихую установку завершена »
Как сюда добавить:
ClearErrors
${GetOptions} "$CMDLINE" "/D=" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$R0"
${EndIf}
Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались?
${If} ${Silent}
ClearErrors
${GetOptions} "$CMDLINE" "/D=" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$R0"
${EndIf}
ClearErrors
${GetOptions} "$CMDLINE" "/I" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$PROGRAMFILES\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
SetShellVarContext All
CreateShortCut "$DESKTOP\${APP}.lnk" "$INSTDIR\${APP}.exe"
CreateDirectory "$SMPROGRAMS\${APP}"
CreateShortCut "$SMPROGRAMS\${APP}\${APP}.lnk" "$INSTDIR\${APP}.exe"
${EndIf}
ClearErrors
${GetOptions} "$CMDLINE" "/Y" $R0
${IfNot} ${Errors}
SetShellVarContext All
Delete "$DESKTOP\${APP}.lnk"
${EndIf}
ClearErrors
${GetOptions} "$CMDLINE" "/T" $R0
${IfNot} ${Errors}
SetShellVarContext All
Delete "$SMPROGRAMS\${APP}\${APP}.lnk"
RMDir "$SMPROGRAMS\${APP}"
${EndIf}
ClearErrors
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors}
StrCpy $INSTDIR "$EXEDIR\${APP}"
SetOutPath "$INSTDIR"
File /r "${APPDIR}\${APP}\*"
${EndIf}
Quit
${EndIf}
AlekseyPopovv, мы уже вам всю обработку с нуля написали, и добавить еще одно условие с ключом /Y - это не сложная задача, учитывая то, как уже разжевана логика проверки ключей+я вам накидал несколько вариантов и пара из них "для новичков" с более простым кодом для понимания.
У меня вот вопрос нарисовывается, а вы вообще пытаетесь вникать в то, что мы тут вам пишем? Или просто копипастите?
AlekseyPopovv
25-10-2019, 17:41
и добавить еще одно условие с ключом /Y - это не сложная задача »
Добавить как понятно, а вот как добавить условие в условие мне не понятно. Так же и с ключом "/D=".
K.A.V.
Привет
Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10?
Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались? »
а вот как добавить условие в условие мне не понятно »
Создаёте условие проверки существования ключа I
Если ключ есть, то следующий код в условии на проверку ключа I - проверка существования ключа Y
Если ключа Y нет, то создавать ярлыки
Простая логика же. Примеры построения логических конструкций есть в нашем справочнике.
Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10? »
А чем, собственно, winver не устраивает? Он вызывает системную функцию GetVersionEx для определения версии системы...
1. Можете проверять версию любого системного файла в папке System32
2. Либо в разделе
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
можете прочитать значения новых DWORD ключей CurrentMajorVersionNumber (10) + CurrentMinorVersionNumber (0), которые появились как раз-таки в Windows 10
AlekseyPopovv
26-10-2019, 19:54
Примеры построения логических конструкций есть в нашем справочнике. »
Да, есть такое. С ярлыками разобрался. А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable".
А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable". »
По хорошему надо дать возможность пользователю менять путь установки для тех случаев, когда это ничего не сломает.
Это можно сделать так:; Создадим константу, которая содержит Путь установки по умолчанию
!define DEFAULT_DIR_INST "$PROGRAMFILES\SomeProgDir"
; Запишем её в атрибут InstallDir. Это будет наш $INSTDIR по умолчанию
InstallDir "${DEFAULT_DIR_INST}"
...
Var commandline ; переменная для считывания командной строки
Var i_CommandlineSetDir ; переменная для хранения состояния "путь взят из командной строки" да=1, нет=0
...
Function .onInit
; Установим переменную в ноль (путь с командной строки не считывался)
StrCpy $i_CommandlineSetDir 0
${GetParameters} $commandline
; Если путь установки, сохранённый в установщике (в ${DEFAULT_DIR_INST}) не совпадает с текущим $INSTDIR,
; значит использовался NSIS параметр /D=
${If} "$INSTDIR" != "${DEFAULT_DIR_INST}"
StrCpy $i_CommandlineSetDir 1 ; установим в единицу, т.е. путь взят из командной строки
${EndIf}
...
${GetOptions} "$CMDLINE" "/P" $R0
${IfNot} ${Errors} ; проверка ключа /P
${If} $i_CommandlineSetDir = 0 ; если путь не взят из командной строки
StrCpy $INSTDIR "$EXEDIR\${APP} Portable" ; меняем его на свой
${EndIf}
${EndIf}
...
FunctionEnd
Приветствую, кто нибудь может адаптировать https://nsis.sourceforge.io/mediawiki/index.php?title=EBanner_plug-in&oldid=6883 под NSIS 3.x
Или подсказать плаг что бы на странице распаковки файлов отобразить bmp/jpg и/или gif, перепробовал кучу на 2.46 работает на третьей версии нет.
diakov, Под NSIS 3.04 примеры из архива с плагином компилируются, запускаются и отображают всё, что прописано.
diakov,
Есть ещё занятный китайский плагин - XZBHelper.
Можно организовать в процессе установки слайд шоу из картинок или, как настроишь (время показа и затухания).
Кроме того, каждая картинка может являться гиперссылкой на какой либо сайт.
Единственное, не то чтобы неудобство, а момент - в инишнике(файл Slides.dat) обязательна "авторская" запись: [_www.xiazaiba.com], остальное редактируемо.
Скачать плагин : https://yadi.sk/d/pnunedULcQdcwg
Ну, и ессно можно поместить картинку на страницу обычным способом при помощи кучи кода... Примеры были.
iglezz, я пробовал компилить в этой сборке https://sourceforge.net/projects/nsisbi/, ничего не отображает.
MKN, спасибо, гляну.
diakov,
Стоило упомянуть, что используется не чистый nsis, ибо в сборках-модификациях поведение может отличаться от стандартного.
Как и в этом случае.
Сборка по умолчанию создаёт unicode-установщик, который, соответственно, передаёт не-unicode плагину unicode-строки, а не ansi. Как результат - плагин получает абракадабру вместо текстовых строк.
Решение 1:
Добавить в скрипт атрибут Unicode false
Решение 2:
Передавать в unicode-установщике ansi-плагину строки конвертированные в ansi.
Добавляем в скрипт макрос для перекодировки (вариант не идеальный, но для большинства случаев достаточный):!define Unicode2Ansi "!insertmacro Unicode2Ansi"
!macro Unicode2Ansi String OutVar
System::Call /NOUNLOAD 'kernel32::WideCharToMultiByte(i 0, i 0, w "${String}", i -1, t .s, i ${NSIS_MAX_STRLEN}, i 0, i 0) i '
Pop "${OutVar}"
!macroend
Перекодируем макросом строку, предназначенную плагину, в переменную
${Unicode2Ansi} "строка" $переменная
которую потом передаём плагину
Plugin::Command $переменная
Таким образом строка
ebanner::show /NOUNLOAD /HALIGN=LEFT /FIT=HEIGHT "$EXEDIR\wizard.jpg"
Превращается в последовательность команд
${Unicode2Ansi} "/HALIGN=LEFT" $R1
${Unicode2Ansi} "/FIT=HEIGHT" $R2
${Unicode2Ansi} "$EXEDIR\wizard.jpg" $R3
ebanner::show /NOUNLOAD $R1 $R2 "$R3"
;--------------------------------
; General Attributes
Name "EmbeddedBanner plug-in test"
OutFile "EBannerU.exe"
;--------------------------------
;Interface Settings
!include "MUI.nsh"
; To reduce package size, 70 bytes 2x2 placeholder
!define MUI_WELCOMEFINISHPAGE_BITMAP plholder.bmp
!define MUI_PAGE_CUSTOMFUNCTION_PRE pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW show
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE leave
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
RequestExecutionLevel user
!define Unicode2Ansi "!insertmacro Unicode2Ansi"
!macro Unicode2Ansi String OutVar
System::Call /NOUNLOAD 'kernel32::WideCharToMultiByte(i 0, i 0, w "${String}", i -1, t .s, i ${NSIS_MAX_STRLEN}, i 0, i 0) i '
Pop "${OutVar}"
!macroend
Function pre
!insertmacro MUI_INSTALLOPTIONS_WRITE "ioSpecial.ini" "Field 1" "Text" ""
Functionend
Function show
${Unicode2Ansi} "/HALIGN=LEFT" $R1
${Unicode2Ansi} "/FIT=HEIGHT" $R2
${Unicode2Ansi} "$EXEDIR\wizard.jpg" $R3
ebanner::show /NOUNLOAD $R1 $R2 "$R3"
FunctionEnd
Function leave
ebanner::stop
FunctionEnd
Section
SectionEnd
AlekseyPopovv
03-12-2019, 16:04
Запускаю приложение командой:
ExecWait "Proga\Proga.exe"
В этом приложении есть настройки, которые вступят в силу после перезагрузки приложения, естественно это приложение само выдаёт запрос на перезагрузку приложения.
Как сделать так, что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?
Либо какой то есть выход с самим процессом "Proga.exe"...
AlekseyPopovv,
Что имеется в виду под "что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?" ?
Какая цель преследуется?
AlekseyPopovv
04-12-2019, 06:51
iglezz,
Всё, спасибо, додумался.
AlekseyPopovv,
Решением, думаю, стоит поделиться -- может ещё сгодится кому-нибудь.
AlekseyPopovv
04-12-2019, 19:29
iglezz, Придумал сам, может есть что то лучше и проще...
Replay:
ExecWait "Proga\Proga.exe"
Sleep 50
${If} ${ProcessExists} "Proga.exe"
${KillProcess} "Proga.exe" $R0
Goto Replay
${Else}
Sleep 50
${EndIf}
Cyberworm
05-01-2020, 15:33
Добрый день. У меня проблема следующего характера. Инсталлятор не может прочитать путь, который указан в переменной по умолчанию. Игра у него установлена, следовательно есть данные в реестре для её удаления и последующего считывания директории.
InstallDirRegKey HKLM "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 17470" "InstallLocation"
Неужели ветка реестра InstallDirRegKey HKLM "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*******" только для избранных?
В параметрах инсталлятора указал RequestExecutionLevel admin, потом его убрал. Ничего не изменилось. Как можно решить или обойти данную проблему? Просто охота, чтобы программа установки самостоятельно искала директорию куда была установлена игра.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC