|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
------- Отправлено: 12:02, 09-12-2012 |
Пользователь Сообщения: 126
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
|
|
Отправлено: 01:34, 10-02-2015 | #1481 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Давеча понадобилось вывести содержимое операций из консоли - в окошко 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 Цитата K.A.V.:
|
|
Последний раз редактировалось MKN, 10-02-2015 в 13:46. Отправлено: 13:30, 10-02-2015 | #1482 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Я нашел выход только в создании ListView элемента, после изучения которого переписал практически все диалоги в SFX Creator Поэтому, могу тебе посоветовать плюнуть на ListBox и создать ListView элемент. Цитата MKN:
В разделе Обучение IO: собственные странички, есть раздел Примеры диалогов, в котором есть один пример Считываем данные из консольного приложения в ListView Посмотришь ради собственного развития) А конкретно тебе нужна WinAPI команда OemToChar, пример использования тоже есть в справке в разделе Примеры кодов на страничке Русские символы в DOS кодировке По поводу работы с элементом ListView - читай следующее: 1. Обучение IO: собственные странички => Элементы в диалоге => ListView: список => ListView: обычный список 2. "CommCtrl.nsh" файл найдёшь на страничке Обучение IO: собственные странички => Введение Использовать команды взаимодействия с элементами, которые описаны в этом разделе можно не только с InstallOptions - различие лишь в том, что там в команды нужно подставить правильный HWND элемента Цитата MKN:
Если что-то не поймёшь или будут вопросы - пиши, мне просто лень код накидывать, в последнее время вообще всё лень... Цитата MKN:
|
||||
------- Отправлено: 18:55, 10-02-2015 | #1483 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
Цитата K.A.V.:
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 Цитата K.A.V.:
Цитата K.A.V.:
Но с LB_GETCURSEL наверное может удастся это реализовать... Как - пока не придумал... ps В доке сказано, что можно посылать данные с помощью /TOWINDOW не только в чёртов ListView : Цитата:
|
|||||
Последний раз редактировалось MKN, 11-02-2015 в 13:19. Отправлено: 12:17, 11-02-2015 | #1484 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Цитата MKN:
Цитата MKN:
В том примере показано, как нужно использовать ExecDos, когда тебе нужно сделать что-то с данными из консольного приложения, а не просто запихнуть весь текст в какой-то элемент И там показано, что команду OemToChar использовать можно только для преобразования строки, но никак не для смены кодировки элемента управления, как ты пытался сделать... ЗАМЕЧАНИЕ ДЛЯ ВСЕХ Возьмите на заметку, если вы пользуетесь плагином ExecDos просто для вывода данных консольного приложения в элемент управления - используйте ключ /TOWINDOW или /DETAILED в зависимости от сиуации, НО, если же вам необходимо произвести какую-то манипуляция с теми данными, которые консольное приложение вам выдаёт - используйте ключ /TOSTACK или /TOFUNC, опять же, в зависимости от ситуации Цитата MKN:
Цитата MKN:
Ладно, дам тебе задание: после того, как ты свой код напишешь, всё сделаешь так, как нужно, попробуй добавить в свой любимый ListBox горизонтальную прокрутку Хочу потом написать здесь "я же говорил" после того, как ты возьмёшься переписывать код под элемент ListView всё готовенькое, как вы любите
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 Цитата MKN:
Цитата MKN:
Я могу понять некоторых личностей, но чтобы ты ленился, MKN, стыдно должно быть Там же в примерах всё есть, ну не сложно же открыть этот чертов ToWindow.nsi, который лежит в архиве с плагином и посмотреть, как там всё устроено, ты же не первый день с NSIS работаешь... В этих примерах я взял стандартный блокнот (закройте копии блокнота перед запуском скомпилированного скрипта, чтобы не записало куда попало), после его запуска скрипт закидывает данные прямо в область редактирования текста (элемент Edit) всё готовенькое (2): /TOWINDOW с иероглифами
!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 всё готовенькое (3): /TOFUNC с обработкой строк и без иероглифов
!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 |
|||||||
------- Отправлено: 15:05, 11-02-2015 | #1485 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
Цитата K.A.V.:
Понятное дело, что Цитата:
Цитата K.A.V.:
Цитата K.A.V.:
Цитата K.A.V.:
А вот пример с /TOFUNC - интересный. Спасибо. |
||||||
Последний раз редактировалось MKN, 11-02-2015 в 16:20. Отправлено: 15:35, 11-02-2015 | #1486 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать Цитата K.A.V.:
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 |
|
Отправлено: 15:59, 11-02-2015 | #1487 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Цитата MKN:
Цитата K.A.V.:
Цитата MKN:
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). Цитата MKN:
Для тебя будет открытием, если я скажу тебе, что та самая область в блокноте, в которой ты набираешь текст - это элемент 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 Цитата MKN:
Цитата MKN:
|
|||||||
------- Отправлено: 16:15, 11-02-2015 | #1488 |
Ветеран Сообщения: 2358
|
Профиль | Отправить PM | Цитировать K.A.V.,
Цитата K.A.V.:
PS После адаптации примера с консолью из справочника под nsDialogs, получаю при компиляции : Цитата:
Такую же ошибку получаю и при компиляции примера из 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 ? Там всего то не большой кусок кода используется. Состряпать макрос из него... |
||
Последний раз редактировалось MKN, 11-02-2015 в 18:24. Отправлено: 16:28, 11-02-2015 | #1489 |
Ленивый кусок мяса Сообщения: 1986
|
Профиль | Сайт | Отправить PM | Цитировать Цитата MKN:
Цитата MKN:
Вот ты говоришь о терпении учителя, да какой тут, когда ты пишешь, как нужно сделать, а человек делает по-своему... Цитата K.A.V.:
|
|||
------- Отправлено: 18:26, 11-02-2015 | #1490 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
[архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 |
|