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

K.A.V.
12-12-2013, 23:05
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

MKN
13-12-2013, 15:36
после нажатия 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 окно, вот мне и нужен код который бы это делал...

K.A.V.
14-12-2013, 02:41
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 !!! ================="
; Записываем информацию в консоль
вы же мне код давали... что я перепутал?

K.A.V.
14-12-2013, 15:32
вы же мне код давали... »
Мой работает, ваш нет - вывод какой?

что я перепутал? »
Вы вообще видите, что я вам написал в предыдущем сообщении? Я там сам для себя строки жирным шрифтом выделил?

Очки наденьте :read:

тяжелый случай, у меня не хватит терпения, я пожалуй пас...

до сих пор не понимаете, что пишите, а желания вам размусоливать нет - толку 0, вы всё равно это пропустите мимо ушей »

Kopejkin
14-12-2013, 15:51
Vincent7, после первой строки === Hello, Vincent7 !!!== поставьте кавычки ( " ). Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется.

K.A.V.
14-12-2013, 16:16
Дальше - не знаю, т.к. приведенный огрызок даже не скомпилируется. »
Он даже скопировать код не может без ошибок, что уж тут говорить про написание такого сложно-извращенного функционала, который ему так нужен...
Он бы уже давно справился со своей задачей с нашей помощью, но ему нужен готовый код и как можно скорее, поэтому и пытается максимум это скопировать готовые строки и перемешать их местами для имитирования того, что в чем то пытался разобраться...

Вот мой код и очень даже рабочий... 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, неужели так трудно было уделить немного времени, из того, что уже прошло впустую, и, хотя бы для себя самого, составить внятный перечень требуемого функционала и получаемых от него в результате возможностей? Опять же копипастить удобнее.

vosya
15-12-2013, 14:29
Прошу помочь в написании скрипта для чтения 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. Я поменял строки в своем коде на правильный порядок, но все равно не работает.

MKN
15-12-2013, 17:07
Прошу помочь в написании скрипта для чтения ini-файла, и исходя из его содержимого »
Уже помогли - Это : Справочник по NSIS - Работа с INI файлами
Там же есть примеры создания ярлыков.

Имею консольную программу распаковщик. Туда нужно вводить команды, нажать' enter' он и начнет распаковывать. С помощью nsis я хочу все это автоматизировать и упростить, сделать GUI к этой программе. »
Для этого совершенно не нужно что либо делать в консольном окне и вообще его видеть. Ведь команды распаковщика наверняка известны ?
Вот и сделай свою страницу с элементами соответствуюшими задачам и командам, и оформляй сообразно фантазии.

Vincent7
15-12-2013, 17:15
Это я и пытаюсь сделать...

MKN
15-12-2013, 17:29
Vincent7,
Попробуй сам реализовать хотя бы такой примитивный сценарий :
На кастомной странице создай пару обзорных кнопок - одну выбрать файл для распаковки, вторую - указать целевой путь для распакованного. Можешь добавить текстовые поля для ручного ввода путей.
Путевые данные из переменных включи в команду распаковки. А саму распаковку запускай (можешь с помощью уже известных тебе плагинов) ещё одной кнопкой.
Для начала всё.
Потом уже добавляй нюансы распаковки, наверняка задаваемые разными ключами. И назови в конце концов, что это за такой у тебя рапаковщик и чего он должен делать...

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

Vincent7
15-12-2013, 17:43
Я хочу для начала разобраться с отправкой в консоль команд, а потом уже все остальное прокручивать. Но пока не выходит :(

MKN
15-12-2013, 17:47
Я хочу для начала разобраться с отправкой в консоль команд, »
Стесняюсь спросить - а на хрена тебе консоль ? Если для поставленной тобой задачи , консоль совершенно не нужна...

Vincent7
15-12-2013, 17:51
А как же тогда делать? Ведь программа консольная... вот, посмотрите http://cs.rin.ru/forum/download/file.php?id=13154




© OSzone.net 2001-2012