Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
K.A.V., боюсь что мне все таки нужен код логирования без использования /tofunc »
В функции при "/tofunc" вы можете вручную "кидать" данные в лог установки, который отображается на страничке прогресса установки, через использование сообщений Windows, а именно через LB_ADDSTRING »
И ниже в том сообщении я вам код уже привел! Имейте совесть, хватит уже издеваться откровенно говоря, "то не хочу", "так не хочу"
Я вам в миллионный раз повторяю, читайте наш Справочник, читайте MSDN для знакомства с сообщениями Windows (в предыдущем посте я вас натолкнул на решение вашей задачи)
Но, видимо, вам всё ещё лень сидеть, читать и разбираться
Так что я боюсь, что вам всё-таки нужно перестать здесь выпрашивать готовые коды и начать читать справочник, смотреть примеры и вникать в смысл написания NSIS-инсталляторов
А "помогать" лично вам, лично у меня уже нет желания, потому что:
1. Вы упорно отказываетесь читать и изучать то, что вам советуют
2. На протяжении всего времени по поводу вашей задачи вы так и не объяснили суть того, что нужно сделать: какой софт имеете, какие задачи стоят и какой функционал реализовать в какой последовательности
А насчет лички у меня одинаковое отношение ко всем - читайте подпись
Не оказываю техподдержку в PM, через Skype и по электронной почте - для этого есть форум
Помогать кому-то индивидуально я могу только в очень редких случаях и не таким ленивцам, как вы
Vincent7
13-12-2013, 01:26
а я и говорил'так не хочу', 'то не хочу' ... просто у меня не получается сделать задуманное... я с nsis худо бедно работаю а msdn вообще темный лес...
kotkovets
13-12-2013, 01:54
Vincent7, ну не судьба, зачем насиловать себе мозг и K.A.V. ?
wolkow70
13-12-2013, 13:13
на системе windows 8.1 не работают? »
все работает »
Пробую запускать на windows 8.1x64 после ${EnableX64FSRedirection} и ${DisableX64FSRedirection}проводник, редактор реестра и значение переменной $SYSDIR и все показывает только на 64 разрядную часть системы.
например:
${DisableX64FSRedirection}
Exec "explorer.exe"
${EnableX64FSRedirection}
Exec "explorer.exe"
Запускается проводник из C:\Windows\explorer.exe в обоих случаях.
Тоже с редактором реестра.
или:
${EnableX64FSRedirection}
MessageBox MB_OK $SYSDIR
${DisableX64FSRedirection}
MessageBox MB_OK $SYSDIR
В обоих случаях $SYSDIR = C:\Windows\System32
после нажатия enter ничего не отправляется в окно установки... »
Попробуй установить задержку перед "нажатием" . Иногда консольное окно появляется с задержкой . Можно попробовать "поймать" его и сделать передним планом.
Сообщения WM_SETTEXT почему то не передаются в консольное окно (у меня так, может чего не учёл...)
Говорят, можно использовать WM_COPYDATA или SendMessageTimeout, не пробовал, да и возиться неохота...
Но можно "набрать" команду в консоли с помощью WM_CHAR. Лажа вообщем то, но работает... Например, пошлём в консоль и выполним команду DIR :
OutFile ConsoleWindow.exe
!include "WinMessages.nsh"
Section
Exec "$SYSDIR\cmd.exe"
loop:
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
IsWindow $0 0 loop
System::Call 'user32::SetForegroundWindow(i r0)'
; так просто, нажмём Enter...
Sleep 300
SendMessage $0 ${WM_CHAR} "0x0D" "0"
; таперича наберём DIR
Sleep 100
SendMessage $0 ${WM_CHAR} 0x44 "0"
Sleep 100
SendMessage $0 ${WM_CHAR} 0x49 "0"
Sleep 100
SendMessage $0 ${WM_CHAR} 0x52 "0"
Sleep 300
SendMessage $0 ${WM_CHAR} "0x0D" "0"
SectionEnd
Только до сих пор не ясно - зачем тебе всё это надо именно в таком извращённо-консольном варианте ? Неужели нельзя организовать выполнение команд из скрипта без консольных посредников ?
Vincent7
14-12-2013, 00:37
MKN, я делаю так
!include "WinMessages.nsh"
OutFile "Test.exe"
ShowInstDetails show
section "f"
ExecDos::exec /NOUNLOAD /ASYNC /Detailed '"$SYSDIR\cmd.exe" /c $EXEDIR\sisInstall.exe extractAll I:\sku.sis D:\h'
sleep 2000
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
FileWrite $0 "D:\h"
sleep 2000
enter:
SendMessage $0 ${WM_CHAR} "0x0D" "0"
sleep 60
goto enter
sectionend
но не работает. этот код постоянно посылает в консоль нажатие' enter', и должно по идее постоянно логироватся соответствующее сообщение консольной программы, но это не происходит. С плагином execCmd- работает но там нет параметра записи данных в nsis окно, вот мне и нужен код который бы это делал...
MKN, я делаю так »
Вы перепутали местами строки в своём коде, до сих пор не понимаете, что пишите, а желания вам размусоливать нет - толку 0, вы всё равно это пропустите мимо ушей
но не работает »
FindWindow $0 "ConsoleWindowClass" "$SYSDIR\cmd.exe"
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
System::Call 'kernel32::AttachConsole(ir0)i.r0'
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
FileWrite $0 "D:\h"
Я вам столько пытаюсь объяснить, помочь, а вы так упорно сопротивляетесь...прям жалко становится, что силы мои здесь напрасно уходят без пользы вам, эх... :cry:
С плагином execCmd- работает но там нет параметра записи данных в nsis окно »
Параметров вам и не дадут, а вот написать свой механизм можно, поэтому я вам и писал ранее использовать "/tofunc", но вы даже не старались
Только до сих пор не ясно - зачем тебе всё это надо именно в таком извращённо-консольном варианте ? »
Спортивный интерес видать, может, заслан с другого форума чтобы проверить силы кодеров осзоновцев на NSIS и посмотреть, сможем ли мы написать? :biggrin:
Vincent7
14-12-2013, 13:31
Caption "PressKey.exe"
OutFile "PressKey.exe"
Function .onInit
FindWindow $0 "ConsoleWindowClass" "Администратор: $SYSDIR\cmd.exe"
; Ищем консольное окно, в котороее будем отправлять информацию
IsWindow $0 +2 0
; Если окно найдено - продолжаем, если нет - сообщение с ошибкой и закрытие прил
MessageBox MB_OK|MB_ICONSTOP "Окно не найдено" idok exit
System::Call 'user32::GetWindowThreadProcessId(ir0, *l.r0)'
; По найденному handle окна определяем PID процесса, к которому принадлежит окно
System::Call 'kernel32::AttachConsole(ir0)i.r0'
; В команду AttachConsole послыаем PID процесса, чтобы писать именно в нашу кома
System::Call 'kernel32::GetStdHandle(i -11)i.r0'
; Получаем дескриптор ввода данных консоли
FileWrite $0 "TEST started...hide window after 3 seconds"
FileWrite $0 "$\n$\n$\n$\n================= Hello, Vincent7 !!! ===============
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
FileWrite $0 "$\n$\n================= Hello, Vincent7 !!! ================="
; Записываем информацию в консоль
вы же мне код давали... что я перепутал?
вы же мне код давали... »
Мой работает, ваш нет - вывод какой?
что я перепутал? »
Вы вообще видите, что я вам написал в предыдущем сообщении? Я там сам для себя строки жирным шрифтом выделил?
Очки наденьте :read:
тяжелый случай, у меня не хватит терпения, я пожалуй пас...
до сих пор не понимаете, что пишите, а желания вам размусоливать нет - толку 0, вы всё равно это пропустите мимо ушей »
Kopejkin
14-12-2013, 15:51
Vincent7, после первой строки === Hello, Vincent7 !!!== поставьте кавычки ( " ). Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется.
Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется. »
Он даже скопировать код не может без ошибок, что уж тут говорить про написание такого сложно-извращенного функционала, который ему так нужен...
Он бы уже давно справился со своей задачей с нашей помощью, но ему нужен готовый код и как можно скорее, поэтому и пытается максимум это скопировать готовые строки и перемешать их местами для имитирования того, что в чем то пытался разобраться...
Вот мой код и очень даже рабочий... 817 (http://forum.oszone.net/post-2265022-817.html)
Kopejkin
14-12-2013, 17:01
Цитата K.A.V.:
...мой код »
Я знаю.
Цитата K.A.V.:
...Он бы уже давно справился... »
Цитата K.A.V.:
...Если вы (Vincent7) бы с самого начала описали, что имеете в наличии (программы/средства и т.д.) и что конкретно со всем этим нужно сделать - мы бы уже сидели и думали, как это реализовать... »
Vincent7, неужели так трудно было уделить немного времени, из того, что уже прошло впустую, и, хотя бы для себя самого, составить внятный перечень требуемого функционала и получаемых от него в результате возможностей? Опять же копипастить удобнее.
Прошу помочь в написании скрипта для чтения ini-файла, и исходя из его содержимого
создание ярлыков (либо в Меню Пуск - Все программы, либо на Рабочем столе).
итак, при запуске надо обратиться к файлу settings.ini, находящемуся по адресу
$WINDIR\MYPROGRAM\ и если его нет, то завершить работу.
Если settings.ini есть по указанному адресу, то поочередно обработать
его секции для создания ярлыков.
при этом settings.ini может редактироваться...
вот примерное содержимое ini-файла:
[SMPROGRAMS] ; куда поместить ярлык
TARGET="TOTAL\TotalCmd.exe" ; путь к исполняемому файлу относительно settings.ini
SHORTCUT="Total Commander" ; название ярлыка
DESCRIPTION="Популярный файловый менеджер" ; описание ярлыка
[DESKTOP]
TARGET="WINRAR\WinRAR.exe"
SHORTCUT="WinRAR"
DESCRIPTION="Надежный архиватор"
[SMPROGRAMS]
TARGET="ПАПКА_1\ПОДПАПКА_2\Программа.exe"
SHORTCUT="Моя программа"
DESCRIPTION="Нужная програмка для дома"
[DESKTOP]
TARGET="ПАПКА_1\ПОДПАПКА_2\Программа.exe"
SHORTCUT="Моя программа"
DESCRIPTION="Нужная програмка для дома"
... и так далее
Vincent7
15-12-2013, 15:30
Объясняю. Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе.
P.S. извиняюсь за криво скопированный код K.A.V.'а, копировал с мобильного телефона т.к. был на работе, а копировать с оперы мини неудобно.
P.P.S. Я поменял строки в своем коде на правильный порядок, но все равно не работает.
Прошу помочь в написании скрипта для чтения ini-файла, и исходя из его содержимого »
Уже помогли - Это : Справочник по NSIS - Работа с INI файлами
Там же есть примеры создания ярлыков.
Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе. »
Для этого совершенно не нужно что либо делать в консольном окне и вообще его видеть. Ведь команды распаковщика наверняка известны ?
Вот и сделай свою страницу с элементами соответствуюшими задачам и командам, и оформляй сообразно фантазии.
Vincent7
15-12-2013, 17:15
Это я и пытаюсь сделать...
Vincent7,
Попробуй сам реализовать хотя бы такой примитивный сценарий :
На кастомной странице создай пару обзорных кнопок - одну выбрать файл для распаковки, вторую - указать целевой путь для распакованного. Можешь добавить текстовые поля для ручного ввода путей.
Путевые данные из переменных включи в команду распаковки. А саму распаковку запускай (можешь с помощью уже известных тебе плагинов) ещё одной кнопкой.
Для начала всё.
Потом уже добавляй нюансы распаковки, наверняка задаваемые разными ключами. И назови в конце концов, что это за такой у тебя рапаковщик и чего он должен делать...
Ежели чего не будет получаться, вот тогда - код в студию и только тогда есть смысл тебе помогать дальше и что то разжевывать...
По моему, именно отсутствие вышеназванных таких твоих действий и возмущает коллег...
Vincent7
15-12-2013, 17:43
Я хочу для начала разобраться с отправкой в консоль команд, а потом уже все остальное прокручивать. Но пока не выходит :(
Я хочу для начала разобраться с отправкой в консоль команд, »
Стесняюсь спросить - а на хрена тебе консоль ? Если для поставленной тобой задачи , консоль совершенно не нужна...
Vincent7
15-12-2013, 17:51
А как же тогда делать? Ведь программа консольная... вот, посмотрите http://cs.rin.ru/forum/download/file.php?id=13154
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.