.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 35
Аватара пользователя
f0r_ce

Re: .: NSIS - все вопросы :. часть 2.

Сообщение f0r_ce »

Цитата K.A.V.:



Там в исходниках самого NSIS и в заголовочных файлах упаковщиков меняется пара надписей и всё это дело пересобирается. Скажите, лично вы, будете так заморачиваться? Прям вижу, как у вас появилось желание качнуть дистрибутив с исходниками NSIS и какой-нибудь Microsoft Visual C++ 2005...
.: NSIS - все вопросы :. часть 2.




Да, придётся заморочиться.


Цитата K.A.V.:



Так какой смысл в этой "защите"?
.: NSIS - все вопросы :. часть 2.




Я же не могу открыть такие инсталляторы...
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Цитата AlekseyPopovv:



По ходу мне только одному не известный.
.: NSIS - все вопросы :. часть 2.




Просто нужно знать в каком месте менять байты через hex редактор
Аватара пользователя
f0r_ce

Re: .: NSIS - все вопросы :. часть 2.

Сообщение f0r_ce »

Цитата K.A.V.:





Код:

Код: Выделить всё

${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} ; проверка на тихую установку завершена

.: NSIS - все вопросы :. часть 2.




Как сюда добавить:



Код:

Код: Выделить всё

ClearErrors
    ${GetOptions} "$CMDLINE" "/D=" $R0
      ${IfNot} ${Errors}
       StrCpy $INSTDIR "$R0"
      ${EndIf}

Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались?



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

${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}
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Можно ещё проще генерить рандомное число номера переменной в коде:

Пример - до 20 :



Код:

Код: Выделить всё

OutFile RandomTest.exe
Function Random
Exch $0
Push $1
System::Call 'kernel32::QueryPerformanceCounter(*l.r1)'
System::Int64Op $1 % $0
Pop $0
Pop $1
Exch $0
FunctionEnd
Section
Push 20
call Random
Pop $0
MessageBox MB_OK "Random $0"
SectionEnd
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Цитата K.A.V.:



и добавить еще одно условие с ключом /Y - это не сложная задача
.: NSIS - все вопросы :. часть 2.




Добавить как понятно, а вот как добавить условие в условие мне не понятно. Так же и с ключом "/D=".
Аватара пользователя
AlekseyPopovv

Re: .: NSIS - все вопросы :. часть 2.

Сообщение AlekseyPopovv »

iglezz,

Ага, въехал...



А как сделать что бы инсталлятор нельзя было открыть в 7z?

Можно в личку.
Аватара пользователя
AlekseyPopovv

Re: .: NSIS - все вопросы :. часть 2.

Сообщение AlekseyPopovv »

Цитата AlekseyPopovv:



Как сделать что бы с ключом /I создавались ярлыки (по умолчанию), а с ключами /I /Y не создавались?
.: NSIS - все вопросы :. часть 2.





Цитата AlekseyPopovv:



а вот как добавить условие в условие мне не понятно
.: NSIS - все вопросы :. часть 2.




Создаёте условие проверки существования ключа I

Если ключ есть, то следующий код в условии на проверку ключа I - проверка существования ключа Y

Если ключа Y нет, то создавать ярлыки

Простая логика же. Примеры построения логических конструкций есть в нашем справочнике.




Цитата Serg866:



Подскажите, пожалуйста, самый простой способ (без использования winver) определить, что у пользователя установлена Windows10? Может по наличию какого-либо файла, который есть только в Win10?
.: NSIS - все вопросы :. часть 2.




А чем, собственно, winver не устраивает? Он вызывает системную функцию GetVersionEx для определения версии системы...

1. Можете проверять версию любого системного файла в папке System32



2. Либо в разделе



Код:

Код: Выделить всё

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

можете прочитать значения новых DWORD ключей CurrentMajorVersionNumber (10) + CurrentMinorVersionNumber (0), которые появились как раз-таки в Windows 10
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Цитата K.A.V.:



Примеры построения логических конструкций есть в нашем справочнике.
.: NSIS - все вопросы :. часть 2.




Да, есть такое. С ярлыками разобрался. А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable".
Аватара пользователя
AlekseyPopovv

Re: .: NSIS - все вопросы :. часть 2.

Сообщение AlekseyPopovv »

Цитата AlekseyPopovv:



А как быть с ключом "/D="? Ведь для ключа /I путь StrCpy $INSTDIR "$PROGRAMFILES\${APP}", а для ключа /P путь StrCpy $INSTDIR "$EXEDIR\${APP} Portable".
.: NSIS - все вопросы :. часть 2.




По хорошему надо дать возможность пользователю менять путь установки для тех случаев, когда это ничего не сломает.



Это можно сделать так:


Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

; Создадим константу, которая содержит Путь установки по умолчанию
!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
Аватара пользователя
K.A.V.

Re: .: NSIS - все вопросы :. часть 2.

Сообщение K.A.V. »

Приветствую, кто нибудь может адаптировать
https://nsis.sourceforge.io/mediawik...-in&oldid=6883
под NSIS 3.x

Или подсказать плаг что бы на странице распаковки файлов отобразить bmp/jpg и/или gif, перепробовал кучу на 2.46 работает на третьей версии нет.
Ответить

Вернуться в «Автоматическая установка приложений»