Ru-Board.club
← Вернуться в раздел «Программы»

» NSIS (Nullsoft Scriptable Install System)

Автор: megane68
Дата сообщения: 23.07.2015 19:52
Victor_VG
На скрине в моём установщике первая кнопка MS Sans Serif, а на второй кнопке Tahoma. Почти не отличишь.
Тут именно в жирности дело, то есть в контрастности.
Автор: Victor_VG
Дата сообщения: 23.07.2015 20:02
megane68

Tahoma использует более толстый контур символа, отсюда и всё остальное. Шрифты разных семейств выглядят по разному.
Автор: megane68
Дата сообщения: 23.07.2015 20:20
Victor_VG
Я так чувствую, что в оригинальном установщике, текст кнопок как- то по другому реализован.

Блин, видимо надо отдохнуть, никак не могу врубиться с привязкой кнопок к группам.
А ведь наверняка всё просто делается.
Автор: megane68
Дата сообщения: 23.07.2015 22:55
Вот ведь, когда некоторое время назад заходил, пропустил сообщение от Sanch8 на страницу с примером:
http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1257&limit=1&m=1
Осталось теперь только разобраться.
Автор: megane68
Дата сообщения: 24.07.2015 02:09
Фух.....
Добил таки тип установки!!!
Огромное СПАСИБО Sanch8 с его примером от sawerx!!!
Скрин.

Цитата:

!include "MUI2.nsh"

Page custom nsCustomShow nsCustomLeave

Var Dialog
Var Label
Var RadioButton1
Var RadioButton2
Var Font1
Var Font2
Var Radio1
Var Radio2

Function nsCustomShow
!insertmacro MUI_HEADER_TEXT "Выберите тип установки:" "стандартный или портативный для всех пользователей."
nsDialogs::Create 1018
Pop $Dialog

CreateFont $Font1 "Tahoma Bold" "8" "700"
CreateFont $Font2 "Tahoma Bold" "8" "700"

${NSD_CreateRadioButton} 0 25u 100u 10u "Standard installation"
Pop $RadioButton1
${NSD_OnClick} $RadioButton1 RadioButton1

SendMessage $RadioButton1 ${WM_SETFONT} $Font1 1 ; Отмечен

${NSD_CreateLabel} 20 40u 300u 10u "Установить для текущего пользователя этого компьютера."
Pop $Label

${NSD_CreateRadioButton} 0 75u 100u 10u "All users or portable"
Pop $RadioButton2
${NSD_OnClick} $RadioButton2 RadioButton2

SendMessage $RadioButton2 ${WM_SETFONT} $Font2 1

${NSD_CreateLabel} 20 90u 300u 10u "Установить для всех пользователей этого компьютера."
Pop $Label

${If} $Radio1 == 1
${OrIf} $Radio2 == 0
${NSD_SetState} $RadioButton1 1
${NSD_SetState} $RadioButton2 0
${ElseIf} $Radio1 == 0
${OrIf} $Radio2 == 1
${NSD_SetState} $RadioButton1 0
${NSD_SetState} $RadioButton2 1
${Else}
${NSD_SetState} $RadioButton1 1
${NSD_SetState} $RadioButton2 0
${EndIf}

nsDialogs::Show
FunctionEnd


Function RadioButton1
Pop $RadioButton1
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
${If} $Radio1 = 0
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "$(^NextBtn)"
${ElseIf} $Radio1 = 1
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "$(^NextBtn)"
${EndIf}
FunctionEnd

Function RadioButton2
Pop $RadioButton2
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2
${If} $Radio2 = 0
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "$(^NextBtn)"
${ElseIf} $Radio2 = 1
GetDlgItem $0 $HWNDPARENT 1
${NSD_SetText} $0 "$(^NextBtn)"
${EndIf}
FunctionEnd

Function nsCustomLeave # эта функция отображает ваши действия!
${NSD_GetState} $RadioButton1 $Radio1 ;считать с чебокса - если отмечен - переход к странице стандартной установки!
${NSD_GetState} $RadioButton2 $Radio2 ;считать с чебокса - если отмечен - переход к странице портативной установки!
FunctionEnd

Section # секция установки файлов!
SetOutPath $INSTDIR
; установочные файлы в $INSTDIR (стандартная установка)!
${If} $Radio1 = 1
SetOutPath "$APPDATA\$Name"
; установочные файлы в $APPDATA (стандартная установка)!
${EndIf}
SetDateSave off
${If} $Radio2 = 1
SetOutPath $INSTDIR
; установочные файлы в $INSTDIR (портативная установка)!
${EndIf}
SectionEnd
Автор: megane68
Дата сообщения: 24.07.2015 10:01
Следующим этапом надо разобраться, чтобы сам установщик выполнялся с правами текущего пользователя, стандартная установка с правами администратора, а портативная опять же с правами текущего пользователя.
Если кто знает как это реализовать, поделитесь пожалуйста!
Автор: sevemez
Дата сообщения: 24.07.2015 10:39
Hi

I need How to make portable with NSIS video tutorial,please help me.
Автор: MKN
Дата сообщения: 24.07.2015 12:03
megane68

Цитата:
чтобы сам установщик выполнялся с правами текущего пользователя

в установщике :

Цитата:
RequestExecutionLevel user



Цитата:
стандартная установка с правами администратора, а портативная опять же с правами текущего пользователя

В начале кода стандартной установки проверяешь права "на админа". Если админ - установка продолжается, если нет - сообщение, что прав нет.
Как проверять права - тьма способов. И плагины и макросы и даже пара строк API функции...

Простейший код :


Цитата:
OutFile "IsUserAdmin-test.exe"

Section
System::Call setupapi::IsUserAdmin()i.r0
StrCmp $0 "1" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Админ"
StrCmp $0 "0" 0 +2
MessageBox MB_OK|MB_ICONINFORMATION "Не админ !"
SectionEnd


Более продвинутый с макросом (меняя SID можно смотреть разные права...) :


Цитата:
outfile UserIsAdmin.exe

!Include "LogicLib.nsh"

!macro _UserIsAdminNT5 _a _b _t _f
Push $1
!insertmacro _LOGICLIB_TEMP
System::Call '*(&i1 1,&i1 2,&i5,&i1 5,&i4 32,&i4 544)i.r1' ;S-1-5-32-544
System::Call 'advapi32::CheckTokenMembership(i n,i r1,*i.s)i.s'
System::Free $1
Pop $1
Pop $_LOGICLIB_TEMP
IntCmpU $1 0 0 +2 +2
StrCpy $_LOGICLIB_TEMP 0
Pop $1
!insertmacro _!= $_LOGICLIB_TEMP 0 `${_t}` `${_f}`
!macroend
!define UserIsAdminNT5 `"" UserIsAdminNT5 ""`

Section
${If} ${UserIsAdminNT5}
DetailPrint "admin"
${Else}
DetailPrint "not admin"
${EndIf}
SectionEnd


Известен и такой код (но как то не четко срабатывает...) :


Цитата:
OutFile "Admin_privileges.exe"
RequestExecutionLevel admin

Section
System::Call "kernel32::GetModuleHandle(t 'shell32.dll') i .s"
System::Call "kernel32::GetProcAddress(i s, i 680) i .r0"
System::Call "::$0() i .r0"
IntCmp $0 1 +3
MessageBox MB_OK "Требуются права администратора для запуска этой установки"
Abort ; "Только пользователь с правами администратора может запустить этот установщик."
SectionEnd


С плагином :


Цитата:
Outfile Example.exe

RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)

!include LogicLib.nsh

Function .onInit
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
MessageBox mb_iconstop "Administrator rights required!"
SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
Quit
${EndIf}
FunctionEnd

Page InstFiles

Section
SectionEnd


Можно сначала перечислить права всех пользователей ПК, потом делать выводы. Выбирай и ищи сам...
Автор: megane68
Дата сообщения: 24.07.2015 13:05
MKN

Спасибо!!!
Буду разбираться с вашим примером.
Начал копать в эту сторону самостоятельно и нашёл плагин UAC, но что- то с ним пока не срастается, и сценарий примера UAC_DualMode выдаёт ошибку в 250-ой строке.

Добавлено:

Цитата:
В начале кода стандартной установки проверяешь права "на админа". Если админ - установка продолжается, если нет - сообщение, что прав нет.

Тут немного другая проблема. Надо не только проверить, надо, чтобы стандартная установка происходила с правами админа.
В оригинальном установщике, если пользователь не админ, то портативная установка не может пройти в Program Files, а на кнопке стандартной установки, виден значок UAC.
http://i71.fastpic.ru/big/2015/0724/48/5b5b454483bb7a4dd89e4b1ecd697148.png
Автор: MKN
Дата сообщения: 24.07.2015 13:23
megane68
К слову про код твоей страницы... Намутили чего то и усложнили...
Можно было, к примеру так :


Цитата:
!include "MUI2.nsh"
!insertmacro MUI_LANGUAGE "Russian"

Page custom MyPage SetFlags
Page Instfiles

Var Dialog
Var RadioButton1
Var RadioButton2
Var Font1
Var Font2
Var Radio1
Var Radio2

Function MyPage
!insertmacro MUI_HEADER_TEXT "Выберите тип установки:" "стандартный или портативный для всех пользователей."
nsDialogs::Create 1018
Pop $Dialog

CreateFont $Font1 "Tahoma Bold" "8" "700"
CreateFont $Font2 "Tahoma Bold" "8" "700"

${NSD_CreateRadioButton} 0 25u 100u 10u "Standard installation"
Pop $RadioButton1
${NSD_SetState} $RadioButton1 1
SendMessage $RadioButton1 ${WM_SETFONT} $Font1 1
${NSD_CreateLabel} 20 40u 300u 10u "Установить для текущего пользователя этого компьютера."

${NSD_CreateRadioButton} 0 75u 100u 10u "All users or portable"
Pop $RadioButton2
SendMessage $RadioButton2 ${WM_SETFONT} $Font2 1
${NSD_CreateLabel} 20 90u 300u 10u "Установить для всех пользователей этого компьютера."

nsDialogs::Show
FunctionEnd

Section "1" St
MessageBox MB_OK "Standard installation"
SectionEnd

Section "2" Port
MessageBox MB_OK "All users or portable"
SectionEnd

Function SetFlags
${NSD_GetState} $RadioButton1 $Radio1
${NSD_GetState} $RadioButton2 $Radio2

${If} $Radio1 = 1
SectionSetFlags ${Port} 0
SectionSetFlags ${St} 1
${EndIf}

${If} $Radio2 = 1
SectionSetFlags ${St} 0
SectionSetFlags ${Port} 1
${EndIf}
FunctionEnd


и шрифт не обязательно новый создавать, если устраивал жирный из заголовка... Есть ведь ${WM_GETFONT}
Но это так, мелочи...

ps
Цитата:
В оригинальном установщике, если пользователь не админ, то портативная установка не может пройти в Program Files

Ну и у себя так сделай... Если пользователь не админ, то ...

ps2


Цитата:
Надо не только проверить, надо, чтобы стандартная установка происходила с правами админа.

Ты хочешь решить двойную задачу одним установщиком.
Чтобы и запускался от пользователя , а потом ещё и устанавливался, как админ, если выбрано...
"Как админ" тут весьма условно - всего лишь установка в иную папку назначения... И если настоящий админ грамотно перекроет кислород посторонним установкам, то рядовой пользователь ничего не сделает... Можно конечно сделать в установщике, чтобы даже для пользователя назначались крутые права, но опять же - зачем ?
Если я тебя правильно понял...

Есть ещё хедер MultiUser.nsh для комбинированных установок...
Наверное проще для "чистой" двойной установкии использовать два дистр-ва с разными правами...
Только нахрена так делать...
Автор: Victor_VG
Дата сообщения: 24.07.2015 14:20
megane68

типа как-то так:

Цитата:
!include "MUI.nsh"
!include LogicLib.nsh

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "Licence.txt"
; Components page
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\dir\app.exe"
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES
; Language files
; MUI end ------
/* semafor's */
var s1 /* as normal */
var s2 /* as portable */
RequestExecutionLevel admin

................
InstallDir "$PROGRAMFILES\dir"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "Path"
ShowInstDetails hide
ShowUnInstDetails hide
Function .onInit
/* init semafor's */
StrCpy $s1 0
StrCpy $s2 0
UserInfo::GetAccountType
pop $0
${If} $0 != "admin"
ExpandEnvStrings $INSTDIR "%SYSTEMDRIVE%\dir"
${EndIf}
FunctionEnd
Section -STAND SEC01
StrCpy $s1 1
StrCpy $s2 0
SectionEnd

Section /o PORT SEC02
StrCpy $s1 1
StrCpy $s2 0
SectionEnd
Section "Main" SEC03
StrCmp $s1 1 stndl
StrCmp $s2 1 +1 stndl
/* install as portable */
.....
goto done
stndl:
/* normal install */

done:
SetAutoclose true
SectionEnd

; Section descriptions
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC01} "Normal install"
!insertmacro MUI_DESCRIPTION_TEXT ${SEC02} "Install as portable"
!insertmacro MUI_FUNCTION_DESCRIPTION_END
Автор: megane68
Дата сообщения: 24.07.2015 14:20
MKN
Ваш пример сценария установщика с кнопками, выдаёт ошибку:

Цитата:
Processed 1 file, 1 command line command, writing output:
Adding plug-ins initializing function... Done!
Error: could not resolve label "_LogicLib_Label_19" in install section "1" (0)
Error - aborting creation process
Автор: Victor_VG
Дата сообщения: 24.07.2015 14:26
megane68

Номер с секциями и семафорами сей ошибки не даст, а остальное просто - не админ летит в корень.
Автор: megane68
Дата сообщения: 24.07.2015 14:28

Цитата:
Ну и у себя так сделай... Если пользователь не админ, то ...

Надо не всеь установщик запускать с правами админа, а только в случае если выбрана стандартная установка.

Цитата:
Только нахрена так делать...

Чтобы при портативной установке нельзя было установить сборку в Program Files.

Добавлено:

Цитата:
Номер с секциями и семафорами сей ошибки не даст, а остальное просто - не админ летит в корень.

Вообще не понял.
Автор: Victor_VG
Дата сообщения: 24.07.2015 14:33
megane68

Нужный скелет я выше привёл, мясо за вами.
Автор: megane68
Дата сообщения: 24.07.2015 14:38
Victor_VG
Скелет выдаёт ошибку, которую я выше привёл. И ваш и от MKN.
Попробовал секции обозвать:
Section "1" SEC01 и т. д., но не помогло.


Добавлено:
Victor_VG
Прошу прощения, Ваш сценарий выдаёт ошибку на 30-ой строке:
var $s1
Очепятка, надо - Var s1

Но, что- то я не понял что он делает? От админа запускается весь установщик, а в выборе типа установки вообще не пойму что?
http://i71.fastpic.ru/big/2015/0724/70/8f916e9c06c0ac35800c4534eca07470.png
Автор: MKN
Дата сообщения: 24.07.2015 15:19
megane68

Цитата:
Ваш пример сценария установщика с кнопками, выдаёт ошибку:

может потому, что не указано очевидное - outfile "xxx.exe" ?
у меня на всех версиях NSIS работает нормально.

Добавлено:

Цитата:
Чтобы при портативной установке нельзя было установить сборку в Program Files.

Это делается без всяких прав - если отмечена кнопка "портабл", то путь назначаешь - не Program Files, а какой душе угодно...
Автор: megane68
Дата сообщения: 24.07.2015 16:08

Цитата:
может потому, что не указано очевидное - outfile "xxx.exe" ?

Не, выходной файл я в первую очередь назначил, это у меня на другом компе портабельный NSIS глючит непонятно почему.
Сейчас нормально всё.

Цитата:
Это делается без всяких прав - если отмечена кнопка "портабл", то путь назначаешь - не Program Files, а какой душе угодно...

Понимаешь в чём дело, это же сборка не включающая в себя официальный дистрибутив foobar2000.
Поэтому я перестраховываюсь от шаловливых ручек пользователя, который установит плеер в PF и обязательно выберет портабельную установку сборки, чтобы пошли глюки.
А так, попробует установить - ан нет, они типа не устанавливается в PF в портабельном виде.
Да и оригинальный установщик хочется повторить.

P.S. C шрифтом проблему решил так:
CreateFont $Font "$(^Font)" "8" "700"

Добавлено:
MKN
Блин...
Теперь и на этом компе появилась ошибка:

Цитата:

Processed 1 file, 1 command line command, writing output:
Adding plug-ins initializing function... Done!
Error: could not resolve label "_LogicLib_Label_19" in install section "1" (0)
Error - aborting creation process

В чём может быть проблема?
Автор: MKN
Дата сообщения: 24.07.2015 16:47
megane68
Установи нормальный NSIS
Автор: megane68
Дата сообщения: 24.07.2015 17:16

Цитата:
Установи нормальный NSIS

Так стоит 2.46.5 Unicode. Это на другом он портабельный был.
Видимо тут в чём- то другом проблема. Только в чём?

Добавлено:
MKN
Кажись победил эту болезнь. сделал в ANSI, а потом перекодировал в Unicode.
Работает.
Спасибо!

А назначать на группу админские права, это слишком геморройно?
Может примеры где есть?
Автор: Victor_VG
Дата сообщения: 24.07.2015 22:36
megane68

Опечатки убрал, возня с правами лишняя. Выбор прост - если портабле он в $PF не идёт и поменять там путь ни-ззя...
Автор: megane68
Дата сообщения: 25.07.2015 10:06

Цитата:
если портабле он в $PF не идёт и поменять там путь ни-ззя...

Было бы замечательно, если бы сборка не накатывалась на оригинальный дистрибутив и устанавливалась с ним вместе. А так получается пользователь установил foobar2000 по своему желанию, а потом бац, а портабельную сборку туда нельзя.
Не.... Пусть пока будет лучше уж весь установщик с правами админа.
Автор: Victor_VG
Дата сообщения: 25.07.2015 10:44
megane68

Я кстати то же явно ошибок наделал - попытался использовать ${EnumProcess} из того хидера что дал MKN и видимо где-то что-то упустил а в итоге наблюдал утечку памяти до 186 Мб когда ось пришибла тестовый процесс. А задумка была красивой - с её помощью отыскать хидер нужного процесса и убить его по хидеру не трогая все остальные. Ладно, значит бум думать дальше.
Автор: megane68
Дата сообщения: 25.07.2015 11:15
Кстати, ошибка "_LogicLib_Label_19" была связана с названием файла *.nsi.
Этот инклюд не любит пробелов в названии.
Автор: Victor_VG
Дата сообщения: 25.07.2015 11:52
megane68

Я их никогда не использую, ибо это ограничение уровня ОС "Путь, или одиночное имя файла включающее пробелы должны заключаться в кавычки" справедливое для всех ОС начиная с первых диалектов AT&T UNIX (1971 г).
Автор: megane68
Дата сообщения: 25.07.2015 12:34

Цитата:
Я их никогда не использую

Я как то после того как начал пользоваться семёркой и макосью, постепенно стал отходит от этого анахронизма. Даже был ни раз бит за это мастодонтами.
Автор: Victor_VG
Дата сообщения: 25.07.2015 13:13
megane68

Ага, вы в сообществе UNIX попробуйте кому сказать что это анахронизм. Только заранее приготовьте бункер понадёжней.
Автор: megane68
Дата сообщения: 25.07.2015 14:17

Цитата:
Только заранее приготовьте бункер понадёжней.

Не скажу ничего плохого о сей братии, лишь только то, что любое сообщество данного типа является определённой сектой, выступающей против законов природы.
Это краеугольный камень всего программирования, который решается всего лишь одним росчерком пера.
Но это в свою очередь кому- то не нужно.
Автор: Victor_VG
Дата сообщения: 25.07.2015 22:19
megane68

А я как раз из этой "братии" и чего так же "казнить, нельзя помиловать"? Сообщество UNIX исторически выросло в университетах где данная ОС получила массовое распространение из-за знаний которые там сконцентрированы, а массовые (простые в управлении) ОС ориентированы на людей с минимальным уровнем знаний и нежеланием учится, а тем более думать, а потому расценивают ЭВМ только как средство развлечения, и для которых слова "инженер, учёный" смертельное оскорбление, а всё, что выходит за пределы их понимания и новостей "сарафанного радио" априори встречают в штыки:

Цитата:
Не скажу ничего плохого о сей братии, лишь только то, что любое сообщество данного типа является определённой сектой, выступающей против законов природы.
Это краеугольный камень всего программирования, который решается всего лишь одним росчерком пера.
Но это в свою очередь кому- то не нужно.

ибо Митрофанушке-потребителю думать не нужно поелику это снижает уровень самооценки его величия и нарушает баланс удовлетворения в его жизни, а умному человеку чтобы не показаться смешным не стоит повторять такую откровенную глупость.
Автор: megane68
Дата сообщения: 26.07.2015 00:32
Victor_VG
Вы просто смотрите на эвм как на средство реализации творчества и своих идей, а я как на средство управления человечеством на глобальном уровне и попытку воссоздать искусственный разум.
То есть с моей точки зрения замена пробелов ведёт к некачественному управлению, и это явно не спроста.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

Предыдущая тема: The Bat!


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.