PDA

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 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

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}

K.A.V.
24-10-2019, 18:38
AlekseyPopovv, мы уже вам всю обработку с нуля написали, и добавить еще одно условие с ключом /Y - это не сложная задача, учитывая то, как уже разжевана логика проверки ключей+я вам накидал несколько вариантов и пара из них "для новичков" с более простым кодом для понимания.
У меня вот вопрос нарисовывается, а вы вообще пытаетесь вникать в то, что мы тут вам пишем? Или просто копипастите?

AlekseyPopovv
25-10-2019, 17:41
и добавить еще одно условие с ключом /Y - это не сложная задача »
Добавить как понятно, а вот как добавить условие в условие мне не понятно. Так же и с ключом "/D=".

Serg866
26-10-2019, 00:44
K.A.V.
Привет
Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10?

K.A.V.
26-10-2019, 08:25
Как сделать что бы с ключом /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".

iglezz
27-10-2019, 02:47
А как быть с ключом "/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

diakov
04-11-2019, 21:58
Приветствую, кто нибудь может адаптировать https://nsis.sourceforge.io/mediawiki/index.php?title=EBanner_plug-in&oldid=6883 под NSIS 3.x
Или подсказать плаг что бы на странице распаковки файлов отобразить bmp/jpg и/или gif, перепробовал кучу на 2.46 работает на третьей версии нет.

iglezz
05-11-2019, 10:10
diakov, Под NSIS 3.04 примеры из архива с плагином компилируются, запускаются и отображают всё, что прописано.

MKN
05-11-2019, 11:12
diakov,
Есть ещё занятный китайский плагин - XZBHelper.
Можно организовать в процессе установки слайд шоу из картинок или, как настроишь (время показа и затухания).
Кроме того, каждая картинка может являться гиперссылкой на какой либо сайт.
Единственное, не то чтобы неудобство, а момент - в инишнике(файл Slides.dat) обязательна "авторская" запись: [_www.xiazaiba.com], остальное редактируемо.
Скачать плагин : https://yadi.sk/d/pnunedULcQdcwg
Ну, и ессно можно поместить картинку на страницу обычным способом при помощи кучи кода... Примеры были.

diakov
05-11-2019, 15:41
iglezz, я пробовал компилить в этой сборке https://sourceforge.net/projects/nsisbi/, ничего не отображает.
MKN, спасибо, гляну.

iglezz
05-11-2019, 18:39
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"...

iglezz
03-12-2019, 23:09
AlekseyPopovv,
Что имеется в виду под "что бы после перезапуска приложения, оно снова запустилось с моего "*.exe" файла?" ?
Какая цель преследуется?

AlekseyPopovv
04-12-2019, 06:51
iglezz,
Всё, спасибо, додумался.

iglezz
04-12-2019, 19:23
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