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

diakov
20-06-2013, 08:58
Тоесть получается, что нельзя сделать перезагрузку именно из функции нажатия бутона, а надо пихать Reboot в секцию установки...но мне это не подходит...хотел именно так...

Как же посоветуешь выйти из ситуации kotkovets, или можно что то придумать?

MKN
20-06-2013, 09:31
diakov,
Если я правильно понял, то раз после нажатия OK сообщения, сразу предполагается Reboot ,
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot -
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. А вот для этого условия могут быть варианты...

diakov
20-06-2013, 10:25
т.е. по сути, сначала закрытие-выход инсталлятора, а затем уже Reboot - »
Совершенно верно.
то можно закрыть инсталлятор после нажатия ОК и после закрытия, организовать Post функцию с Reboot и с условием, что был нажат нужный ОК. »
А поподробней, желательно примерчик :)

MKN
20-06-2013, 12:59
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 - только условие для установки драйвера. Сделаешь , как тебе надо.

Наверняка можно и по другому сделать.

diakov
20-06-2013, 14:01
MKN, немного не то, мне надо что бы перезагрузка происходила именно после выполнения всех команд в функции нажатия бутона, пробовал писать Quit, Abort и т.д. не помогает инстальник не закрывается, как сделать это именно в функции что бы он закрылся?
Если воспользоватся командой ${KillProcess} то инстальник убивается но ф-ция .onGUIEnd не отрабатывает.

MKN
20-06-2013, 15:50
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


У меня так работает

diakov
20-06-2013, 16:35
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

diakov
20-06-2013, 20:34
kotkovets, так какой выход посоветуете из ситуации?

kotkovets
20-06-2013, 21:17
diakov,
как алкоголь 120% установку видели.. вот точно так можно..
что тут сложного.. в установку все перенести
ps.
или отдельно написать установку драйвера (на nsis) - кнопкой тупо запускать установщик ( в тихом режиме)..

diakov
20-06-2013, 22:36
Ок, буду кумекать.

MKN
21-06-2013, 09:05
я уже писал на кастомной страничке - это внезапное прерывание »
Не поленился проверил :
На кастомной странице Quit точно отрабатывается в Section.
И в Function, вызванной из Section - тоже нормально.
Ну и до кучи проверил - в Function вызванной из Function - нормальный Quit выход-закрытие.

diakov
21-06-2013, 09:50
MKN, так, или я чето туплю:

Function ClickButton1
pop $btn1
Call ClickButton2
FunctionEnd


Function ClickButton2
MessageBox MB_ICONEXCLAMATION|MB_OK "Выход."
Quit
FunctionEnd

И ничего не выходит...
Склоняюсь ближе к совету kotkovets, на счет написать отдельно инстальник драйвера...

MKN
21-06-2013, 13:27
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
Но чем закончилось - не понятно...

diakov
22-06-2013, 14:37
Вышел из ситуации написав отдельный ехе-шник по установке драйвера, по совету kotkovets.

dix75
24-06-2013, 12:33
Добрый день!

Необходимо до самого инсталляционного пакета показывать окно типа:
"Установить обновление". С кнопками установить и отменить.

Делается веьсма просто пишется exe файл из которого пускаем NSIS инсталлятор.
Но возможно ли непосредственно в cамом NSIS инсталяторе написать такое.
т.е первую страницу?
Подскажите куда копать.

dix75
27-06-2013, 15:28
Добрый день!

Раньше я получал $StartMenuFolder так
!insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder

Вопрос решен

silione
14-07-2013, 16:42
Никак не разберусь, можно ли как-то обойти ограничение в 2 Гигабайта при создании инсталлятора?
Видел, что можно использовать архивы, но во-первых, не понял как это сделать (примеров не нашел), во-вторых, давнишние сообщения, возможно к настоящему времени есть более интересные решения?
Если не сильно затруднит, попрошу развернутый ответ, с примером написания кода, или ссылкой на таковой пример.

Awral
16-07-2013, 10:39
Появилась небольшая проблема. Растянул 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). При последующих переходах наложение только увеличивается.

Как мне исправить эти проблемы?

Заранее спасибо

K.A.V.
18-07-2013, 15:30
установил прозрачность фона для 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