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

kotkovets
01-12-2013, 22:45
Не, там фишка с ключем /NOUNLOAD /ASYNC, если их указать, то плаг запустить процесс параллельно установщику »
упёрто отказывается читать в файле справки, в котором ясно написано - второй параметр в команде FindWindow - это класс окна, а он там указывает имя окна »
ну если это фишка...
значит не судьба Vincent7 :not-me:

Vincent7
02-12-2013, 01:13
section "f"
ExecDos::exec /NOUNLOAD /ASYNC /DETAILED '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
sleep 3000
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 +2 0
MessageBox MB_OK|MB_ICONSTOP "not found" idok
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "Test"
sectionend
теперь все правильно, вроде как находит окно, но по идее слово test должно появится в nsisном окне установки файлов, а оно не появляется. и установщик переходит в статус 'выполнено'

K.A.V.
02-12-2013, 01:31
но по идее слово test должно появится в nsisном окне установки файлов »
:o это с какого такого такого такого...оно должно там появиться, если вы отправляете текст в консоль, а не напрямую в NSIS элемент?

Вы хотите что сделать, чтобы запустить консоль, отправить туда текст, а потом чтобы ваше консольное приложение его прочитало и отобразило в NSIS окне? :o

Пожалуй, я воздержусь в дальнейшем от ответов на ваши сообщения, сидите тут пудрите нам мозги откровенно говоря, нет чтобы четко и ясно разъснить, что вы хотите сделать

и установщик переходит в статус 'выполнено' »
Конечно переходит, вы же сами просили запустить консольное приложение параллельно установщику

:shot:

Vincent7
02-12-2013, 01:41
плагин execDos с параметром /DETAILED отправляет содержимое командной сроки окну установщика

kotkovets
02-12-2013, 02:18
Vincent7, скажу просто: не тупите!
а то цирк уехал, а клоуны остались..

MKN
06-12-2013, 16:12
Вызов диалогового окна выбора файлов

Пример для '*.nsi;*.nsh'


Caption "Диалоговоое окно выбора файлов"
OutFile "OpenFile_Test.exe"
SilentInstall silent

!define OFN_READONLY 0x00000001
!define OFN_OVERWRITEPROMPT 0x00000002
!define OFN_HIDEREADONLY 0x00000004
!define OFN_NOCHANGEDIR 0x00000008
!define OFN_SHOWHELP 0x00000010
!define OFN_ENABLEHOOK 0x00000020
!define OFN_ENABLETEMPLATE 0x00000040
!define OFN_ENABLETEMPLATEHANDLE 0x00000080
!define OFN_NOVALIDATE 0x00000100
!define OFN_ALLOWMULTISELECT 0x00000200
!define OFN_EXTENSIONDIFFERENT 0x00000400
!define OFN_PATHMUSTEXIST 0x00000800
!define OFN_FILEMUSTEXIST 0x00001000
!define OFN_CREATEPROMPT 0x00002000
!define OFN_SHAREAWARE 0x00004000
!define OFN_NOREADONLYRETURN 0x00008000
!define OFN_NOTESTFILECREATE 0x00010000
!define OFN_NONETWORKBUTTON 0x00020000
!define OFN_NOLONGNAMES 0x00040000
#if(WINVER >= 0x0400)
!define OFN_EXPLORER 0x00080000 ; new look commdlg
!define OFN_NODEREFERENCELINKS 0x00100000
!define OFN_LONGNAMES 0x00200000
!define OFN_ENABLEINCLUDENOTIFY 0x00400000
!define OFN_ENABLESIZING 0x00800000
#endif /* WINVER >= 0x0400 */
#if (_WIN32_WINNT >= 0x0500)
!define OFN_DONTADDTORECENT 0x02000000
!define OFN_FORCESHOWHIDDEN 0x10000000
#endif // (_WIN32_WINNT >= 0x0500)

!define OPENFILENAME "(i,i,i,i,i,i,i,i,i,i,i,t,t,i,i,i,t,i,i,t,*v,i,i) i"

Section
Push `${OFN_ALLOWMULTISELECT}|${OFN_EXPLORER}` ;Flags
Push `Откройте файл` ;lpstrTitle
System::Call "*(&t1024) i .r1" ;lpstrFile
System::Call "*(&t25 'NSIS файл (*.nsi, *.nsh)', &t12 '*.nsi;*.nsh', &t9 'Все файлы', &t5 '*.*') i .r2" ;lpstrFilter
System::Call "Kernel32::GetModuleHandle(i) i.s" ;hInstance
Push $HWNDPARENT ;hwndOwner
System::Call "*${OPENFILENAME}(76,s,s,r2,,,0,r1,1024,,,,s,s,_) i.r0"
System::Call "Comdlg32::GetOpenFileName(i r0) i.r3"
StrCmp $3 0 0 +3
MessageBox MB_ICONINFORMATION|MB_OK " Вы не выбрали файл !"
Goto done
System::Call "*$1(&t1024 .r3)"
System::Call "*$0${OPENFILENAME}(,,,,,,,,,,,,,,.r4,_)"
IntOp $4 $4 - 1
StrLen $5 $3
StrCmp $4 $5 +3
MessageBox MB_ICONINFORMATION|MB_OK "Вы выбрали файл: $3"
Goto done
MessageBox MB_ICONINFORMATION|MB_OK "Вы выбрали в каталоге $3 , следующие файлы :"
StrCpy $5 $1
loop:
StrLen $4 $3
IntOp $5 $5 + $4
IntOp $5 $5 + 1
System::Call "*$5(&t1024 .r3)"
StrCmp $3 "" done
MessageBox MB_ICONINFORMATION|MB_OK "$3" ;Цикл для имен выбранных файлов
Goto loop
done:
System::Free $0
System::Free $1
System::Free $2
SectionEnd

K.A.V.
06-12-2013, 16:36
Вызов диалогового окна выбора файлов
Пример для '*.nsi;*.nsh' »
Не знаю, как остальные, но лично я противник таких "жирных кодов", какой в них смысл?
Есть замечательные плагины типа Dialogs plug-in (http://nsis.sourceforge.net/Dialogs_plug-in), которые позволяют сократить количество строк в коде до пары (1 строка вызов команды + ваш остальной код)
Неужели вас страшит лишние пары десятков Кб из-за добавления DLL плагина в пакет? :)

Я, конечно, понимаю, что WinAPI это хорошо, но мне кажется только тогда - когда это необходимо и нечем заменить нужный функционал
А использовать тонны кода для простеньких задач это как-то не айс, тем более кто лично в этой теме реально понимает, что ты написал? ;)

Ты, я, Вячеслав и ещё возможно пара человек, которые реально хотят кодить на NSIS и которые полностью прочитали наш справочник, включая описание System.dll и сидящие на MSDN для изучения WinAPI функций, есть вообще такие здесь?

Я, честно признаюсь, раньше не использовал System.dll по одной простой причине - сложно было понять англ.доки по нему и читал описание данного плага из нашего же справочника :biggrin:, благодаря переводу Вячеслава я совсем недавно уже начал иногда применять system.dll в своём же "креаторе", мне раньше было проще написать dll, сейчас уже практически всё наоборот

Ты бы лучше взял и оформил все свои примеры, которые здесь выкладываешь, в стиле нашего справочника, редактить html не так уж и сложно через визуальные редакторы, я , к примеру использую лёгкий NVU - вполне сходит для создания и оформления лёгких страничек для справочников :)

MKN
06-12-2013, 16:58
но лично я противник таких "жирных кодов", какой в них смысл? »
Смысл - в познании нового, в привлечении и развитии интереса пользователей к творческому процессу. Вдруг кто то захочет плагинчик сделать ? :) Более совершенный чем тот же Dialogs plug, который конечно хорош, но лишён гибкости, в отличии от вышеприведённого кода.
Я тоже не люблю жирных кодов и без нужды не использую. Но любой такой жиряга - это и есть внутренности плагинов и хедеров, которыми все с удовольствием пользуются, потому что этот жиропродукт в итоге позволяет обойтись парой строк кода... :)
Ты бы лучше взял и оформил все свои примеры, которые здесь выкладываешь »
Имеются ввиду API_шные ? Какой из меня учитель... Я сам только учусь. Если уж кто и сможет грамотно научить , то это Вячеслав...

areafix
07-12-2013, 11:10
Скажите, можно ли через NSIS сделать выбор типа/режим установки, ПЕРЕД выбором компонентов

http://i.imgur.com/4LU6u6W.png

чтобы при выборе одного из режимов у него был свой независимый набор файлов / секций / свои настройки деинсталлятора / иконок

можно ли это сделать стандартными средствами (пока не удалось найти как)?, если да/нет то в какую хоть сторону копать?

kotkovets
07-12-2013, 12:04
можно ли это сделать стандартными средствами (пока не удалось найти как)?, если да/нет то в какую хоть сторону копать? »
1. » nsDialogs: Создаем собственные страницы инсталлятора
2. » Логические конструкции в скриптах NSIS в справочнике
3. » Создание своего инсталлятора на NSIS. Секции и выбор компонентов
4. » Читаем про свойства флагов секций: скрытие, переименование, отметки
изменяем флаги (свойства секций) в зависимости от отметки радиобутонов
естественно все это делаем до показа странички компонентов.
Section
${If} $radio1 == 1

;куча команд
;если отмечен первый флажок

${ElseIf} $radio2 == 1

;куча команд
;если отмечен второй флажок

${EndIf}
SectionEnd

wolkow70
07-12-2013, 19:15
Можно ли в стандартном окне мессадж-бокса
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST
заменить надписи "да" и "нет" на кнопках на свои?
Мне например нужно, чтобы отображалось "32" и "64".
Не могу найти ничего по этому вопросу.

MKN
07-12-2013, 19:51
Можно ли в стандартном окне мессадж-бокса
MessageBox MB_YESNO|MB_USERICON|MB_TOPMOST
заменить надписи "да" и "нет" на кнопках на свои? »
В стандартных вряд ли... Но был занятный плагин - MessageBox Plug-In, где это можно делать.

MKN
11-12-2013, 12:23
Ещё раз об индикации PrоgressBar_ом - реального процесса установки. Т.е. - сколько чего установилость - столько и отобразилось.
Метод вставки в код, команд приращения прогресса - громоздкий и не точный.
А если сделать так :
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ?

Vincent7
11-12-2013, 15:26
В справочнике имеется код создания лога установки... можно ли его переделать чтобы он считывал данные из командной строки и выводил их в окне установки файлов? exec dos плагин не может одновременно работать с параметрами /tofunc и /detailed... помогите.

K.A.V.
11-12-2013, 17:33
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ? »
А багнутый прогресс не получится? Если, к примеру, будет другая активность на разделе? Твой прогресс просто умрёт, разве нет?
Разве что ты постоянно будешь знать количество уже скопированных данных либо сколько осталось скопировать, но думаю это тоже будет проблемно контролить

Как это лучше реализовать на практике ? »
Вот поэтому в своём SFX Creator при подключении "Прогресса распаковки файлов" я там сделал принцип подсчета количества распакованных файлов, а не количество скопированных данных
Если бы подключался там интерфейс - можно было бы брать прогресс из существующего прогресса, который контролит сам инсталлер
А у тебя как? Подключаешь граф интерфейс?

В справочнике имеется код создания лога установки... можно ли его переделать чтобы он считывал данные из командной строки и выводил их в окне установки файлов? exec dos плагин не может одновременно работать с параметрами /tofunc и /detailed... помогите. »
При использовании "/tofunc" у вас появляется возможность использовать всё, что только захотите, но вы же не хотите изучать что-то новое, поэтому ссылки вам кидать бесполезно
В функции при "/tofunc" вы можете вручную "кидать" данные в лог установки, который отображается на страничке прогресса установки, через использование сообщений Windows, а именно через LB_ADDSTRING

Небольшой пример, как добавить данные в ListBox прогресса установки (этот код у меня в моём проекте, поэтоме переменные менять не буду, а описание сообщений Windows читайте в MSDN)

SendMessage $R8 ${LB_ADDSTRING} 0 `STR:$2`
SendMessage $R8 ${LB_GETCOUNT} 0 0 $3
IntOp $3 $3 - 1
SendMessage $R8 ${LB_SETTOPINDEX} $3 0


$R8 - HWND элемента ListBox
$2 - текст строки, которая добавляется
$3 - количество уже существующих строк

kotkovets
11-12-2013, 19:29
Зная объём устанавливаемых данных и вычислив объём свободного пространства на целевом диске - контролировать в процессе установки изменение объёмв целевого диска. И исходя из этого изменения - изменять длину полосы индикатора PB.
Как это лучше реализовать на практике ? »
только плагином - многопоточность вычислений, стандартно маловозможно.

MKN
12-12-2013, 11:00
Если на время работы инсталлятора необходимо автоматически переключить(установить) языковую раскладку клавиатуры, то для этого существует макрос :


outfile KeyboardLayout.exe

!macro LoadLangLayout LangID
!define Index "Line${__LINE__}"
StrCpy $8 "${LangID}" "" 2
StrCpy $8 "0000$8"
System::Alloc ${NSIS_MAX_STRLEN}
Pop $R0
System::Call 'user32::GetKeyboardLayoutList(i ${NSIS_MAX_STRLEN}, i R0)i.r0'
StrCpy $9 1

loop-${Index}:
System::Call '*$R0(i .r1)'
IntFmt $2 "%08x" $1
StrCpy $3 $2 "" -4
StrCpy $4 "0x$3"
IntOp $R0 $R0 + 4
StrCmp $4 ${LangID} macro_end_${Index}
StrCmp $9 $0 loop_end-${Index}
IntOp $9 $9 + 1
Goto loop-${Index}

loop_end-${Index}:
System::Call 'user32::LoadKeyboardLayoutA(t r8, i 1)i.r0'
macro_end_${Index}:
System::Call 'user32::ActivateKeyboardLayout(i ${LangID}, i 8)i.r0'
!undef Index
!macroend

Section
; установка EN
!insertmacro LoadLangLayout 0x0409
SectionEnd


После отработки скрипта (т.е. закрытия инсталлятора) - раскладка возвращается в исходное состояние.

wolkow70
12-12-2013, 16:02
Товарищи правильно ли я понял, что макросы редиректора WOW64
${EnableX64FSRedirection}
${DisableX64FSRedirection}
на системе windows 8.1 не работают?

kotkovets
12-12-2013, 19:11
на системе windows 8.1 не работают? »
все работает

Vincent7
12-12-2013, 20:45
K.A.V., боюсь что мне все таки нужен код логирования без использования /tofunc ... как я вам писал, после нажатия enter ничего не отправляется в окно установки...
Function LogFunction
IntOp $1 $1 + 1
Pop $2
FunctionEnd


section "f"
StrCpy $1 0
GetFunctionAddress $0 LogFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h' "D:\h" $0
sleep 3000
Pop $0
Pop $2
${If} $2 = "INFO : Please insert path of folder with depot 222481 version 300092705199761674 manifest (222481_300092705199761674.manifest)"
MessageBox MB_OK|MB_ICONSTOP "$2" idok
${Else}
enter:
FindWindow $3 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
SendMessage $3 ${WM_CHAR} "0x0D" "0"
sleep 60
${If} $2 = "INFO : Please insert path of folder with depot 222481 key file (222481.depotkey)"
MessageBox MB_OK|MB_ICONSTOP "$2" idok
goto end
${Else}
goto enter
${EndIf}
${EndIf}
end:
sectionend
не работает :(




© OSzone.net 2001-2012