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

MaGoth
10-02-2015, 01:34
Не забудьте, что nsisUnRar2 будет работать только при использовании граф. интерфейса (при исполнении из секции), может, запустите и из под .onInit, копайтесь, если хотите, мне разбираться не особо интересно в этой теме »
Ога, ща посчупаем... :)

MKN
10-02-2015, 13:30
Давеча понадобилось вывести содержимое операций из консоли - в окошко NSIS...
ExecDos, как говорится, мне в помощь, вроде как всё хорошо, но оказалось всё же совсем не хорошо... А именно :

Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку...
Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... )
И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ?


!include MUI2.nsh
;!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE English
OutFile TOWINDOW_test.exe
Var Dlg
Var Log
Page custom myPage wait

Function myPage
nsDialogs::Create 1044
Pop $Dlg

${NSD_CreateListBox} 0 10 330u 100u $Log
Pop $Log

ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $Log
Pop $9

nsDialogs::Show
FunctionEnd

Function wait
ExecDos::wait $9
FunctionEnd

Section
SectionEnd


о галочке "Запуск от имени администратора" в свойствах ярлыка. »
Хорошо, что реализовал для NSIS этот известный полезный трюк. Когда то здесь уже обсуждался, но тогда без результата.

K.A.V.
10-02-2015, 18:55
Каким образом из окна ListBox_а можно скопировать выведенные текст-данные ? Посылал ListBox на разные стили - всё бестолку... »
Я помню, как я настрадался с этим элементом в своём SFX Creator, у меня был такой же вопрос, но лично у меня не получилось получить текст в строке, поэтому...

Я нашел выход только в создании ListView элемента, после изучения которого переписал практически все диалоги в SFX Creator :biggrin:
Поэтому, могу тебе посоветовать плюнуть на ListBox и создать ListView элемент.

Наивный вопрос, но без ответа - почему русские буковки в ListBox_е, у меня в виде кракозябров ? ( В ОС (W7x32) все кодовые страницы , файлы и записи реестра приведены к 1251... Толку - ноль... ) »
А вот полезно было бы читать все странички в справке, а не только те, которые тебе нужны, в справочнике, как ни странно, есть решение этой проблемы :)
В разделе Обучение IO: собственные странички, есть раздел Примеры диалогов, в котором есть один пример Считываем данные из консольного приложения в ListView
Посмотришь ради собственного развития)
А конкретно тебе нужна WinAPI команда OemToChar, пример использования тоже есть в справке в разделе Примеры кодов на страничке Русские символы в DOS кодировке

По поводу работы с элементом ListView - читай следующее:
1. Обучение IO: собственные странички => Элементы в диалоге => ListView: список => ListView: обычный список
2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента

И каким образом отображать в окне ListBox_а только первые, к примеру, нужные мне 10 строк ? »
Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка, возможно, это то, о чем ты спросил...

Если что-то не поймёшь или будут вопросы - пиши, мне просто лень код накидывать, в последнее время вообще всё лень...

Хорошо, что реализовал для NSIS этот известный полезный трюк. Когда то здесь уже обсуждался, но тогда без результата. »
не помню уже причину, по которой тогда это не реализовал, видимо, не было настроения, а потом и забыл про этот вопрос... :)

MKN
11-02-2015, 12:17
Обучение IO: собственные странички »
Очень не хотелось бы связываться с IO, который забраковали даже сами разрабы, как явно устаревший и во всём уступающий nsDialogs...
пример Считываем данные из консольного приложения в ListView »
Даже если пересилить себя :) и связаться допотопным IO, то этот способ оч громоздский по сравнению с одной строкой
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW

Но оказалось есть интересный способ получить данные из ListBox_а (конечно не в полной мере, какой хотелось бы...), но всё же выход :


OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox
;System::Call "user32::OemToChar(t$ListBox, t.$ListBox)" #ни хрена не работает, местоположение менял...
ExecDos::exec /NOUNLOAD /ASYNC /TOWINDOW "cmd /?" "" $ListBox
Pop $hcli
nsDialogs::Show
FunctionEnd

Function leave
SendMessage $ListBox ${LB_GETCURSEL} 0 0 $1
IntOp $1 $1 + 1
;MessageBox MB_OK $1
System::Call user32::SendMessage(i$ListBox,i${LB_GETTEXT},ir1,t.r1)
;System::Call "user32::OemToChar(tr1, t.r1)" # здесь работает, но здесь не надо...
MessageBox MB_OK $1
ExecDos::wait $hcli
FunctionEnd

Section
SectionEnd

в справочнике, как ни странно, есть решение этой проблемы »
Точно так. Знал ведь , да забыл... Но почему то не работает там, где надо (см. пример в коде, комбинировал по разному - без результата... ). Может я чего опять упустил...

Не совсем понял вопрос, но...в справке на страничке описания ListView есть в сааамом конце команда для перемотки списка »
Я имел ввиду, что из консоли мне насыпится куча строк, а надо использовать только конкретные номера строк, а остальные ессно игнорировать...
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал...

ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView :
Edit, RichEdit, ListView and ListBox supported
А как бы это сделать на практике ? Например, отправить инфу в окно Edit (с помощью nsDialogs :) ) ...

K.A.V.
11-02-2015, 15:05
Очень не хотелось бы связываться с IO »
Даже если пересилить себя и связаться допотопным IO »
Ты вообще читал моё сообщение или глазами по нему пробежался? Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз.

Но оказалось есть интересный способ получить данные из ListBox_а»
Ты смотрел пример моего диалога в файле справки? Видимо, нет
В том примере показано, как нужно использовать ExecDos, когда тебе нужно сделать что-то с данными из консольного приложения, а не просто запихнуть весь текст в какой-то элемент
И там показано, что команду OemToChar использовать можно только для преобразования строки, но никак не для смены кодировки элемента управления, как ты пытался сделать...

ЗАМЕЧАНИЕ ДЛЯ ВСЕХ
Возьмите на заметку, если вы пользуетесь плагином ExecDos просто для вывода данных консольного приложения в элемент управления - используйте ключ /TOWINDOW или /DETAILED в зависимости от сиуации, НО, если же вам необходимо произвести какую-то манипуляция с теми данными, которые консольное приложение вам выдаёт - используйте ключ /TOSTACK или /TOFUNC, опять же, в зависимости от ситуации

Я имел ввиду, что из консоли мне насыпится куча строк, а надо использовать только конкретные номера строк, а остальные ессно игнорировать... »
Мой пример в моём примере :)

Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал... »
Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый?

Ладно, дам тебе задание: после того, как ты свой код напишешь, всё сделаешь так, как нужно, попробуй добавить в свой любимый ListBox горизонтальную прокрутку
Хочу потом написать здесь "я же говорил" после того, как ты возьмёшься переписывать код под элемент ListView :biggrin:


OutFile ExecDos_TOWINDOW.exe
!include nsDialogs.nsh
Var Dialog
Var hcli
Var ListBox
Page custom MyPage leave

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
${NSD_CreateListBox} 0 20 100% 100u "$ListBox"
Pop $ListBox


GetFunctionAddress $0 MyFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC `cmd /?` "" $0
Pop $hcli

nsDialogs::Show
FunctionEnd


Function leave
ExecDos::wait $hcli
FunctionEnd


Function MyFunction
Pop $2
; в эту переменную кидается по-отдельности каждая строка, которую конс. приложение выдаёт
; можешь пропустить и не добавлять данные в элемент (как ты хотел, можно заюзать IntOp+StrCmp, например обнуляя переменную IntOp через каждые 3 прохода)
; что-то типа такого...
;IntOp $R0 $R0 + 1
;StrCmp $R0 4 0 noAddString
;StrCpy $R0 0

System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $ListBox ${LB_ADDSTRING} 0 "STR:$2"
#MessageBox MB_OK|MB_ICONINFORMATION "Добавляется строка:$\n$2"

; noAddString:
FunctionEnd


Section
SectionEnd



ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView : »
Да лааадно? Кто-то наконец-то открыл документацию к плагину? :o :up

А как бы это сделать на практике ? Например, отправить инфу в окно Edit »
Может, заглянешь там ещё в папку Examples? Ходят слухи, что там что-то интересное и ты будешь рад это увидеть :)
Я могу понять некоторых личностей, но чтобы ты ленился, MKN, стыдно должно быть :(
Там же в примерах всё есть, ну не сложно же открыть этот чертов ToWindow.nsi, который лежит в архиве с плагином и посмотреть, как там всё устроено, ты же не первый день с NSIS работаешь...


В этих примерах я взял стандартный блокнот (закройте копии блокнота перед запуском скомпилированного скрипта, чтобы не записало куда попало), после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit)


!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"

OutFile "!TEST.exe"


Function .onInit
exec "notepad"
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0
ExecDos::exec /TOWINDOW "cmd /?" "" $1
quit
FunctionEnd


Section -post
SetAutoClose false
SectionEnd




!addincludedir "."
!addplugindir "."
!include "WinMessages.nsh"

OutFile "!TEST.exe"



Function .onInit
exec "notepad"
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0
GetFunctionAddress $0 MyFunction
ExecDos::exec /NOUNLOAD /ASYNC /TOFUNC `cmd /?` "" $0
pop $0
ExecDos::wait $0
quit
FunctionEnd

Function MyFunction
Pop $2
System::Call "user32::OemToChar(tr2, t.r2)"
SendMessage $1 ${EM_REPLACESEL} 0 "STR:$\r$\n$2"
FunctionEnd



Section -post
SetAutoClose false
SectionEnd

MKN
11-02-2015, 15:35
Я тебе ни слова не говорил про то, чтобы использовать IO, перечитай моё сообщение ещё раз. »
Хмм... А как же тогда понимать :
В разделе Обучение IO: »
и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO :)
Понятное дело, что
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions
Но этот вопрос надо сначала ещё тщательно изучить и переварить... Я с этими глистбоксами и виевирами вообще никогда не сталкивался...
Может, заглянешь там ещё в папку Examples? »
в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO ( ну не дело это, использовать дополнительные ini файлы)
В этих примерах я взял стандартный блокнот, после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit) »
Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS...

Я тебе ещё раз повторяю про элемент ListView, почему ты такой упёртый? »
Почему упёртый... Пока не вижу в ListView достойной альтернативы (во всяком случае в данный момент для своей задачи. Может потом, когда припрёт, и оценю :) ) ... И код в примере из справочника велик, и опять - c IO...

А вот пример с /TOFUNC - интересный. Спасибо.

MKN
11-02-2015, 15:59
попробуй добавить в свой любимый ListBox горизонтальную прокрутку »
Это, как раз, давно придумано :

OutFile ListBox_H-Scroll.exe
!include nsDialogs.nsh
Var Dialog
Var ReleaseNotesText
Page custom MyPage

Function MyPage
nsDialogs::Create 1018
Pop $Dialog
nsDialogs::CreateControl /NOUNLOAD ${__NSD_ListBox_CLASS} ${__NSD_ListBox_STYLE}|${WS_HSCROLL} ${__NSD_ListBox_EXSTYLE} 0 13u 262u -13u ""
Pop $ReleaseNotesText
${NSD_LB_AddString} $ReleaseNotesText "A pretty loooooooooooooooooooooooooooooooooooooooooooooooong striiiiiiiiiiing"
${NSD_LB_AddString} $ReleaseNotesText "A really long string that should be longer than the listbox that contains this message, so I can enable the horizontal scrollbar!"
SendMessage $ReleaseNotesText ${WM_GETFONT} 0 0 $R0
System::Call user32::GetDC(i$ReleaseNotesText)i.R1
System::Call gdi32::SelectObject(i$R1,i$R0)i.R0
System::Call *(i,i)i.r0
StrCpy $2 0
${NSD_LB_GetCount} $ReleaseNotesText $1
loop:
IntOp $1 $1 - 1
System::Call 'user32::SendMessage(i $ReleaseNotesText,i ${LB_GETTEXT},i $1,t.r3)'
StrLen $4 $3
System::Call 'gdi32::GetTextExtentPoint32(i $R1,t "$3",i $4,i $0)'
System::Call *$0(i.r4,i)
IntOp $4 $4 + 10 ;add a little padding
${IfThen} $4 > $2 ${|} StrCpy $2 $4 ${|}
IntCmp $1 0 "" "" loop
System::Free $0
System::Call gdi32::SelectObject(i$R1,i$R0)i
System::Call user32::ReleaseDC(i$ReleaseNotesText,i$R1)
SendMessage $ReleaseNotesText ${LB_SETHORIZONTALEXTENT} $2 0
nsDialogs::Show
FunctionEnd

Section
SectionEnd


Да. Громозда... Но зато без IO ! :)

K.A.V.
11-02-2015, 16:15
Хмм... А как же тогда понимать : »
и т.д., включая пример "Считываем данные из консольного приложения" - сплошные IO »
Я же тебе ясно написал:
Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента »
Если ты читаешь мои сообщения, пропуская строки - то уж извини, какой тогда смысл мне так подробно всё расписывать и тратить своё время, если ваши глаза только готовый код видят и не читают того, что я здесь пишу?

в первую очередь заглянул - ничего интересного, т.к. опять же, в том же ToWindow.nsi - чертовы IO »
Да какая разница, на чем пример построен, IO или nsDialogs? У плагина команда не меняется в зависимости от того, что мы используем, тебе нужно смотреть синтаксис команды и какие данные в неё подставляются:

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $R8 $0 1016
ExecDos::exec /TOWINDOW /TIMEOUT=6000 "$EXEDIR\consApp.exe" "test_login$\ntest_pwd$\n" $R8
Pop $R6 ; return value - process exit code or error or STILL_ACTIVE (0x103).

Здесь же прекрасно видно, что получают HWND элемента поиском окна и командой GetDlgItem, помещая результат в $R8 и далее эта переменная используется в команде с плагином...

Причём тут блокнот ?! Под Edit подразумевается созданная пользователем , автономная область окна, на странице NSIS... »
Ты серьёзно? Ты посмотри на мой код внимательней и ещё скажи, из чего в принципе состоит графический интерфейс каждого приложения? Из множества элементов, не?
Для тебя будет открытием, если я скажу тебе, что та самая область в блокноте, в которой ты набираешь текст - это элемент Edit?
Возьми любой похожий софт типа программки "InqSoft Window Scanner", которая тебе на интерфейсе программы/инсталлятора покажет, какие в интерфейсе типы элементов и каковы их стили

А по какому принципу, ты думаешь, работает мой код? Именно по тому, что сначала ищет окно конкретной программы (в моём случае блокнот), а затем уже ищет элемент Edit в этом самом родительском окне...Я же не мог тебе предоставить код, который бы искал не понятно где в системе элемент Edit и запихивал туда данные, ну а писать специально для этого пример на nsDialogs или IO с интерфейсом NSIS мне лень, честно говоря...кода меньше и наглядно всё видно, без лишних строк
stget:
Sleep 1000
FindWindow $0 "notepad" ""
StrCmp $0 "0" stget 0
FindWindow $1 "Edit" "" $0
StrCmp $1 "0" stget 0


и опять - c IO... »
промолчу...всё выше написал

Это, как раз, давно придумано : »
какая жесть, не удивительно, что я не додумался до этого в то время... :lol:

MKN
11-02-2015, 16:28
K.A.V., Если ты читаешь мои сообщения, пропуская строки - то уж извини, какой тогда смысл мне так подробно всё расписывать »
Я внимательно читаю твои сообщения, откуда черпаю много полезного. Но ListBox и ListView, для меня совершенно новы и не знакомы... Ну не приходилось с ними ещё работать, потому и много вопросов и недоумений. :) И конечно понятное дело, что всё связанное с IO можно использовать и с nsDialogs. Только это надо сначала изучить и осознать, что требует времени, терпения и усидчивости... Со всем этим , как оказалось - проблемы... :) Но, не без твоей помощи, проблемы эти преодолеваются. А роль наставника и учителя требует терпения и снисходительности к ученикам. :) Этих качеств , как мне кажется, многие пользователи NSIS темы и тебе желают. :)

PS После адаптации примера с консолью из справочника под nsDialogs, получаю при компиляции :
!verbose: Invalid verbose level
Error in macro __NSD_LV_InsertColumn_Call on macroline 2
т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1"

Такую же ошибку получаю и при компиляции примера из http://nsis.sourceforge.net/Header_file_for_Listview
Может CommCtrl.nsh не дружит с NSIS3 ? (2.46 нет под рукой)

ps2 Да, не дружит... Проверил на 2.46 - всё нормально компилится с примером из http://nsis.sourceforge.net/Header_file_for_Listview
Адаптированный пример из справочника, рисует только пустой Listview... Видать что то не доадаптировал... Ну да то ладно... Что делать с CommCtrl.nsh в NSIS3 ?
Может можно вообще отказаться от CommCtrl.nsh ? Там всего то не большой кусок кода используется. Состряпать макрос из него...

K.A.V.
11-02-2015, 18:26
Что делать с CommCtrl.nsh в NSIS3 ? »
Всё отлично там работает, не надо тут панику разводить)

т.е. ругается на строку в коде : ${NSD_LV_InsertItem} $ListView "0" "$1" »
Заставить тебя ещё раз мои сообщения прочитать? :)
Вот ты говоришь о терпении учителя, да какой тут, когда ты пишешь, как нужно сделать, а человек делает по-своему...

2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение »

MKN
11-02-2015, 18:35
CommCtrl.nsh ессно у меня есть и находится где положено : \NSIS\Include\CommCtrl.nsh

ps Да, у меня оказалась другая версия CommCtrl.nsh, которой всегда пользовался и всё всегда работало... Заменил на ту , что в справочнике, ошибка пропала.
Откуда интересно этот файл взят ? Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawiki/images/6/6a/ListView.zip
как на многих ресурсах и рекомендуется , то с NSIS 3 получит ошибку... Кто бы мог подумать...

K.A.V.
11-02-2015, 18:56
Откуда интересно этот файл взят ? »
Мне его kotkovets подарил... :biggrin: с этого события и началась разработка нового интерфейса SFX Creator...

Если пользователь возьмёт его из архива с http://nsis.sourceforge.net/mediawik...a/ListView.zip »
А какое нам дело до тех пользователей, которые не читают наш справочник?))

как на многих ресурсах и рекомендуется »
Ну...Мы же - не многие :tongue:

MaGoth
11-02-2015, 20:14
K.A.V.,
Глянул ваш пример по прогрессу, работает, хотя до конца не все оттестировал еще, но есть один мелкий графический баг, см. ,вложение.
Как его побороть без ковыряния в ресурсах Нсис?! http://worldofplayers.ru/images/smilies/bw.gif

И дополнительно хотелось бы:
- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках..
- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар?
- при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера.

Спасибо..

K.A.V.
11-02-2015, 22:01
но есть один мелкий графический баг, см. ,вложение. »
У вас есть, у меня нет :)

Как его побороть без ковыряния в ресурсах Нсис?! »
Зачем в ресурсы то лезть, просто команду подкорректируйте, размеры прогресса...

- уменьшить высоту второго прогресс бара, на одну треть или в половину от текущей(надо поиграться с его настройками), как я понял из System::Call, параметры этого элемента прописаны, только не понятно что есть что в циферках.. »
Есть такая штука, как MSDN, например, там есть подробное описание всех WinAPI функций, какие параметры передаются, какой тип данных должен быть, какие вообще могут применяться команды к интересующему вас элементу управления.

Для создания элемента мы используем команду CreateWindowEx (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680%28v=vs.85%29.aspx), описание на русском, например, можно посмотреть здесь (http://www.firststeps.ru/mfc/winapi/win/r.php?58), гуглится всё достаточно легко

Из описания команды, думаю, вам всё станет более-менее ясно, какие параметры за что отвечают
System::Call 'user32::CreateWindowEx(i0,t"msctls_progress32",t"",i${WS_CHILD}|${WS_VISIBLE},i5,i120,i520,i20,i$R0,i6666,i0,i0) i.R2'

HWND WINAPI CreateWindowEx(
_In_ DWORD dwExStyle,
_In_opt_ LPCTSTR lpClassName,
_In_opt_ LPCTSTR lpWindowName,
_In_ DWORD dwStyle,
_In_ int x,
_In_ int y,
_In_ int nWidth,
_In_ int nHeight,
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu,
_In_opt_ HINSTANCE hInstance,
_In_opt_ LPVOID lpParam
);
5 - позиция по горизонтали
120 - позиция по вертикали
520 - ширина
20 - высота

- узнать, как правильно передать исполняемые процессы из какой-либо .dll, например, nsisUnRar2.dll, в этот созданный прогресс бар ? »
С этим я вряд ли что-то подскажу, если у dll есть возможность отрабатывать с callback функцией, то сможете такое сделать, если нет - увы, маловероятно
Следует учесть тот факт, что у нас нет ни доков к этой dll, ни исходника...Так что в таком случае, можете только сидеть и методом тыка что-то пробовать, может чего и получится :)
Вы же видите, что при начале распаковки файла из архива - dll показывает инфу в основном прогрессе + отображает текстовую информацию над прогрессом, эта dll была специально запилена под NSIS, сомневаюсь, что разрабы писали её как универсальное средство, как пишут плагины для NSIS...

при достижении 100% выполнения, удалять этот прогресс из окна оставляя только основной прогресс в окне инсталлера. »
Команда ShowWindow вам в помощь, описание есть в справочнике

MKN
12-02-2015, 11:45
K.A.V.,
Вчера я говорил, что "адаптированный" под nsDialogs пример "Считываем данные из консольного приложения в ListView" из справочника - не работает : получаю чистый ListView.
( чтобы никого не злить - у меня не работает... :) )
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" .

Но достаточно добавить ${NSD_LV_InsertColumn} $ListView 0 450 "column 0" - и сразу всё работает. ( Не понятно, почему так получается, что обязательно нужно определить конкретный столбец и почему LVS_NOCOLUMNHEADER у меня игнорируется... )
Вот упрощённый код для этой ситуации :

!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"

Page custom MyDialog ""
!insertmacro MUI_LANGUAGE "Russian"

Caption "Получение информации из консольного приложения"
OutFile "NOCOLUMNHEADER-Test.exe"

Var dlg
Var /global ListView

Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" # не работает
${NSD_LV_InsertColumn} $ListView 0 450 "column 0" # работает

call getSystemInfo
nsDialogs::Show
FunctionEnd

Function getSystemInfo
${NSD_LV_InsertItem} $ListView "0" "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbb"
SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
FunctionEnd

Section
SectionEnd

Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... :) Почему вдруг ?

ps Действительно можно обойтись и без CommCtrl.nsh, закинув из него в скрипт только нужные макросы... ( Но это, наверное, не тот случай, когда нужно экономить... )

K.A.V.
12-02-2015, 13:46
Ты наверное будешь смеяться, но оказалось дело в том, что гасит всё, применение стиля ${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}" »
Конечно буду, т.к. этот стиль не влияет на функционал, этот стиль всего-лишь убирает отображение колонок
Здесь проблема в другом, как я выяснил только что, всё дело в том, что в nsDialogs создание ListView происходит не так, как в IO, такое ощущение, что nsDialogs создаёт совсем голый элемент, и для того, чтобы "всё заработало", необходимо вручную дописать команду на вставку колонки, пусть даже и "невидимой"
Т.е. после создания элемента тебе нужно дописывать команду на вставку колонки:
${NSD_LV_InsertColumn} $ListView 0 450 ""
В IO таких телодвижений не требуется, там элемент создаётся сразу в "рабочем состоянии"


!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "CommCtrl.nsh"
;!include "FileFunc.nsh"

Page custom MyDialog
!insertmacro MUI_LANGUAGE "Russian"

OutFile "NOCOLUMNHEADER-Test.exe"

Var dlg
Var /global ListView

Function MyDialog
nsDialogs::Create 1018
Pop $dlg
${NSD_CreateListView} 0u 0u 300u 140u ""
Pop $ListView
SendMessage $ListView ${LVM_SETEXTENDEDLISTVIEWSTYLE} "${LVS_EX_FULLROWSELECT}" "${LVS_EX_FULLROWSELECT}"
${NSD_AddStyle} $ListView "${LVS_NOCOLUMNHEADER}"
${NSD_LV_InsertColumn} $ListView 0 450 ""
call getSystemInfo
nsDialogs::Show
FunctionEnd



Section
SectionEnd


Function getSystemInfo
Push "ExecDos::End" # Add a marker for the loop to test for.
ExecDos::exec /NOUNLOAD /TOSTACK "systeminfo" "" ""
Pop $0 # return value
StrCmp $0 0 0 Failed
## Loop through stack.
Loop:
Pop $1
StrCmp $1 "ExecDos::End" ExitLoop
System::Call "user32::OemToChar(tr1, t.r1)"
# SendMessage $R2 ${WM_SETTEXT} "0" "STR:$1"
SendMessage $ListView ${LVM_GETITEMCOUNT} "" "" $R1
${NSD_LV_InsertItem} $ListView "0" "$1"
SendMessage $ListView ${LVM_ENSUREVISIBLE} $R1 1
SendMessage $ListView ${LVM_SETCOLUMNWIDTH} "0" "${LVSCW_AUTOSIZE}"
Goto Loop
ExitLoop:
Return # Exit Function / Section
Failed:
MessageBox MB_OK "Exit code $0"
Return # Exit Function / Section
FunctionEnd




Section -post
SetAutoClose false
SectionEnd

опять панику разводишь, не работает у него ничего :biggrin:

Ну, и до кучи : у меня Caption "Получение информации из консольного приложения" - кракозябрами... Почему вдруг ?
Без понятия, что у тебя там с кодировками :) Я вот недавно пересел с 32 бита на 64, теперь тоже мучаюсь с кодировками, из NIS Edit всё в иероглифах, нужно открывать через другой текстовик, чтобы скопировать текст с родным языком...

MKN
12-02-2015, 15:28
опять панику разводишь, не работает у него ничего »
Но ведь действительно - не работает, ты ведь сам убедился :) , пока не добавишь ${NSD_LV_InsertColumn}, что я сразу и сделал.
И никакой паники - просто информирую пользователей, ( чтобы у них не было паники, когда пример не заработает, т.е. у тех, кто не захочет связываться с допотопным IO :) )

Без понятия, что у тебя там с кодировками »
Вот и я без понятия. Все рекомендации для такого случая вроде как выполнил...

ps И к слову сказать, ты напрасно называешь, якобы вытянутый из тебя, :) код - "всё готовенькое" :) Это самый что ни на есть настоящий и наглядный - пример, логически вытекающий из имеющегося описания в справочнике и вопросов-обсуждений на форуме. Это ведь - общепринятая форма обучения и закрепления любого материала. Именно по конкретному коду легче всего понимать предмет изучения. ( Жаль, что в справочнике таких примеров, мало или они вообще отсутствуют (может тогда и не было бы лишних вопросов))...

Kopejkin
12-02-2015, 18:38
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: нужно заменить число 1 в строке, следующей за [SearchPOT].

http://savepic.su/4989876.png

MaGoth
12-02-2015, 18:45
Подскажите, можно ли заменить текст или число в определенной строке? Например, как на снимке: число 1 в строке, следующей за [SearchPOT] »
А это что файл или чего такое ?!

Kopejkin
12-02-2015, 19:19
А это что »
Это обычный текстовый файл.
Так содержимое выглядит в Notepad+, если включить отображение всех символов.

http://savepic.su/5000129.png




© OSzone.net 2001-2012