Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Тоесть получается, что нельзя сделать перезагрузку именно из функции нажатия бутона, а надо пихать Reboot в секцию установки...но мне это не подходит...хотел именно так...
Как же посоветуешь выйти из ситуации kotkovets, или можно что то придумать?
diakov,
Если я правильно понял, то раз после нажатия OK сообщения, сразу предполагается Reboot ,
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot -
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. А вот для этого условия могут быть варианты...
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot - »
Совершенно верно.
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. »
А поподробней, желательно примерчик :)
diakov,
Самое простое, если устанавливается драйвер, то в TEMP ещё помещается и маркерный файл (предположим пустой файл - drv) и исходя из его наличия совершается нужное действие (перезагрузка) после закрытия инсталлятора. ( Нет маркерного файла - нет перезагрузки. )
!include "MUI2.nsh"
OutFile "Test_OK-Reboot.exe"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section
SetOutPath "$TEMP"
File "drv"
MessageBox MB_ICONEXCLAMATION|MB_OK "ОК - перезагрузка."
Quit
SectionEnd
Function .onGUIEnd
${If} ${FileExists} "$TEMP\drv"
MessageBox MB_OK "Reboot"
Delete "$TEMP\drv"
;Reboot
${Else}
${EndIf}
FunctionEnd
в примере в Section - только условие для установки драйвера. Сделаешь , как тебе надо.
Наверняка можно и по другому сделать.
MKN, немного не то, мне надо что бы перезагрузка происходила именно после выполнения всех команд в функции нажатия бутона, пробовал писать Quit, Abort и т.д. не помогает инстальник не закрывается, как сделать это именно в функции что бы он закрылся?
Если воспользоватся командой ${KillProcess} то инстальник убивается но ф-ция .onGUIEnd не отрабатывает.
diakov,
Вызови функцию из функции или ещё откуда :
Section
Call ClickButton1
SectionEnd
Function ClickButton1
SetOutPath "$TEMP"
File "drv"
MessageBox MB_ICONEXCLAMATION|MB_OK "ОК - перезагрузка."
Quit
FunctionEnd
Function .onGUIEnd
${If} ${FileExists} "$TEMP\drv"
;MessageBox MB_OK "Reboot"
Delete "$TEMP\drv"
Reboot
${Else}
${EndIf}
FunctionEnd
У меня так работает
MKN, ну вот допустим так:
Function ClickButton1
pop $btn1
IfFileExists "$SYSDIR\drivers\sptd.sys" 0 NotFiles
MoreInfo::GetFileVersion "$SYSDIR\drivers\sptd.sys"
Pop $1
${StrFilter} "$1" "1" "." "()" $0
MessageBox MB_USERICON|MB_YESNO 'Обнаружена установленная версия драйвера SPTD $0.$\n Хотите обновить драйвер до версии 1.83? $\n$\n (В конце установки ПК будет автоматически перезагружен.)' IDYES +2 IDNO
Abort
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
SetOutPath "$TEMP"
File "D:\ystanovka\Alcohol 120\diakovreb.txt"
Quit
NotFiles:
${If} ${RunningX64}
ExecWait '"$PLUGINSDIR\SPTD64.exe" add /q'
${Else}
ExecWait '"$PLUGINSDIR\SPTD86.exe" add /q'
${EndIf}
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" "Setup" '"$EXEPATH"'
SetOutPath "$TEMP"
File "D:\ystanovka\Alcohol 120\diakovreb.txt"
Quit
FunctionEnd
Function .onGUIEnd
BrandingURL::Unload
${If} ${FileExists} "$TEMP\diakovreb.txt"
MessageBox MB_ICONEXCLAMATION|MB_OK "После нажатия на кнопку ОК компьютер автоматически перезагрузится."
Delete "$TEMP\diakovreb.txt"
Reboot
${Else}
${EndIf}
FunctionEnd
Но сама команда Quit не отрабатывает, установщик не закрывается, а если закрыть его руками (на самой кастомной странице) то тогда идет вызов ф-ции Function .onGUIEnd и все отлично работает. Какую команду прописать что бы установщик сам закрывался...
Можна тупо написать автоитовский скрипт и сэмулировать нажатия на кнопки, но хочется средствами нсис...
kotkovets
20-06-2013, 19:03
Но сама команда Quit не отрабатывает »
я уже писал на кастомной страничке - это внезапное прерывание, потому что в это время, не 100% nsis:)
здесь винда, вот на помощь и идет апи..
завершить процесс можно и плагинами или читая наш справочный материал.
зы.
но внезапное прерывание не выгружает плагинов загруженные нсисом..
это я в скрипте вижу - BrandingURL
kotkovets, так какой выход посоветуете из ситуации?
kotkovets
20-06-2013, 21:17
diakov,
как алкоголь 120% установку видели.. вот точно так можно..
что тут сложного.. в установку все перенести
ps.
или отдельно написать установку драйвера (на nsis) - кнопкой тупо запускать установщик ( в тихом режиме)..
я уже писал на кастомной страничке - это внезапное прерывание »
Не поленился проверил :
На кастомной странице Quit точно отрабатывается в Section.
И в Function, вызванной из Section - тоже нормально.
Ну и до кучи проверил - в Function вызванной из Function - нормальный Quit выход-закрытие.
MKN, так, или я чето туплю:
Function ClickButton1
pop $btn1
Call ClickButton2
FunctionEnd
Function ClickButton2
MessageBox MB_ICONEXCLAMATION|MB_OK "Выход."
Quit
FunctionEnd
И ничего не выходит...
Склоняюсь ближе к совету kotkovets, на счет написать отдельно инстальник драйвера...
diakov,
Вот мой код :
!include "MUI2.nsh"
Page custom a
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "TestQuit.exe"
Var dlg
Var Button1
Function a
nsDialogs::Create 1044
Pop $dlg
${NSD_CreateButton} 26u 26u 66u 14u "Button1"
Pop $Button1
${NSD_OnClick} $Button1 ClickButton1
nsDialogs::Show
FunctionEnd
Function ClickButton1
pop $Button1
MessageBox MB_OK "OK - Quit"
SendMessage $HWNDPARENT 0x408 1 0
FunctionEnd
Section
Quit
SectionEnd
При таком раскладе в Section ничего не должно быть кроме Quit. Все установочные дела - в функциях.
Возможно можно работать и с несколькими секциями, но наверное придётся манипулировать с их флагами...
Кстати, этот вопрос уже поднимался http://forums.winamp.com/showthread.php?t=140929
Но чем закончилось - не понятно...
Вышел из ситуации написав отдельный ехе-шник по установке драйвера, по совету kotkovets.
Добрый день!
Необходимо до самого инсталляционного пакета показывать окно типа:
"Установить обновление". С кнопками установить и отменить.
Делается веьсма просто пишется exe файл из которого пускаем NSIS инсталлятор.
Но возможно ли непосредственно в cамом NSIS инсталяторе написать такое.
т.е первую страницу?
Подскажите куда копать.
Добрый день!
Раньше я получал $StartMenuFolder так
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder
Вопрос решен
Никак не разберусь, можно ли как-то обойти ограничение в 2 Гигабайта при создании инсталлятора?
Видел, что можно использовать архивы, но во-первых, не понял как это сделать (примеров не нашел), во-вторых, давнишние сообщения, возможно к настоящему времени есть более интересные решения?
Если не сильно затруднит, попрошу развернутый ответ, с примером написания кода, или ссылкой на таковой пример.
Появилась небольшая проблема. Растянул HEADER_BITMAP на всю ширину (в файле Contrib\UIs\modern_headerbmp.exe). Чтобы текст не заходил за изображение исправил очерёдность инициализации и установил прозрачность фона для Header.Text в файле Interface.nsh:
!macro MUI_GUIINIT_OUTERDIALOG UNINSTALLER
;Initialize outer dialog (fonts & colors)
;Header
GetDlgItem $mui.Header.Text $HWNDPARENT 1037
CreateFont $mui.Header.Text.Font "$(^Font)" "$(^FontSize)" "700"
SendMessage $mui.Header.Text ${WM_SETFONT} $mui.Header.Text.Font 0
GetDlgItem $mui.Header.SubText $HWNDPARENT 1038
SetCtlColors $mui.Header.Text "" "transparent"
SetCtlColors $mui.Header.SubText "" "transparent"
;Header image
!insertmacro MUI_HEADERIMAGE_INIT "${UNINSTALLER}"
;Header background
GetDlgItem $mui.Header.Background $HWNDPARENT 1034
SetCtlColors $mui.Header.Background "" "${MUI_BGCOLOR}"
;Header image background
GetDlgItem $mui.Header.Image $HWNDPARENT 1039
SetCtlColors $mui.Header.Image "" "${MUI_BGCOLOR}"
;Branding text
GetDlgItem $mui.Branding.Background $HWNDPARENT 1028
SetCtlColors $mui.Branding.Background /BRANDING
GetDlgItem $mui.Branding.Text $HWNDPARENT 1256
SetCtlColors $mui.Branding.Text /BRANDING
SendMessage $mui.Branding.Text ${WM_SETTEXT} 0 "STR:$(^Branding)"
;Lines
GetDlgItem $mui.Line.Standard $HWNDPARENT 1035
GetDlgItem $mui.Line.FullWindow $HWNDPARENT 1045
;Buttons
GetDlgItem $mui.Button.Next $HWNDPARENT 1
GetDlgItem $mui.Button.Cancel $HWNDPARENT 2
GetDlgItem $mui.Button.Back $HWNDPARENT 3
!macroend
Появились проблемы:
1. При переходе с Welcome_PAGE на следующую страницу (в моём случае LicensePage, но это значения не имеет) текст не отображается, а начинает отображаться только со страницы, следующей за LicensePage (в моём случае ComponentPage).
2. При переходе с лицензии на компоненты и обратно появляется наложение предыдущего текста на текущий (http://savepic.org/4023962.jpg). При последующих переходах наложение только увеличивается.
Как мне исправить эти проблемы?
Заранее спасибо
установил прозрачность фона для Header.Text в файле Interface.nsh: »
Восстанови оригинал, приучайтесь не делать изменинй в таких глобальных файлах, т.к. просто потом можете забыть, где и что меняли и сидеть парить голову со следующим скриптом (из личного опыта)
Перед показом страничек, добавь выполненение нашей будущей функции
; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
page custom SetTransparentText
!insertmacro MUI_PAGE_LICENSE "C:\Users\APTEM\Desktop\test.txt"
; Components page
page custom SetTransparentText
!insertmacro MUI_PAGE_COMPONENTS
; Directory page
page custom SetTransparentText
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
page custom SetTransparentText
!insertmacro MUI_PAGE_INSTFILES
; Finish page
page custom SetTransparentText
!insertmacro MUI_PAGE_FINISH
И добавь эту самую функцию:
Function SetTransparentText
GetDlgItem $0 $HWNDPARENT 1037
GetDlgItem $1 $HWNDPARENT 1038
SetCtlColors $0 "" "transparent"
SetCtlColors $1 "" "transparent"
ShowWindow $0 0
ShowWindow $0 1
ShowWindow $1 0
ShowWindow $1 1
FunctionEnd
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC