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

MKN
02-02-2016, 10:46
K.A.V.,
- Поиск нужной кнопки по тексту на кнопке, не годится для случаев, когда никакого текста нет... Т.е. когда на кнопке - скин-картинка с текстом (OK, Cancel и т.п. ).
Такое встречается очень часто. Особенно в окнах, назовём их тактично, так : "продуктов сопровождения для разных приложений" :). Там же , как правило, отключены и табы и др. Нужно поизгиляться для перемещения между разными элементами (комбобоксы с выпадающими списками, разные текстовые поля, кнопки и пр. )
Такие "приложения" - отличный полигон для изучения-применения возможностей NSIS :)

А ещё, совершенно не понятно, как с помощью NSIS можно кликать кнопками в окнах с IEFrame (в инсталляторах Corel и др ).
Для AutoIt для этого вроде как есть специальная библиотека. чего делать в NSIS, не ясно...

существует ли плагин или макрос по работе с фаерволом (добавление, удаление и проверка правил)? »
http://nsis.sourceforge.net/NSIS_Simple_Firewall_Plugin
http://nsis.sourceforge.net/LiteFirewall_Plugin

или использовать команды из скрипта :
http://webistore.ru/administrirovaniye-windows/nastrojka-brandmauera-windows-v-komandnoj-stroke/

Serg866
03-02-2016, 04:39
Парни, вас приветствует Serg866.

Возникла нестандартная задача, нужно проверить содержимое текстового файла.
По принципу: если есть фраза "version1.1", то один путь установки, если нет - другой путь.
Может примерчики скинете какие-нибудь?
В справке только пример как заменять текст в текстовиках...

BuZzOFF
03-02-2016, 09:43
Возникла нестандартная задача, нужно проверить содержимое текстового файла. »
Увы, сейчас нет nsis'а под рукой...
Тут посмотри => http://nsis.sourceforge.net/WordFind
И в теме тоже были примеры использования ${WordFind}.

MKN
03-02-2016, 16:00
нужно проверить содержимое текстового файла.
По принципу: если есть фраза "version1.1" »
самое простое - NewTextReplace NSIS plugin
работает и с ANSI и с UNICOD

Serg866
05-02-2016, 00:25
Спасибо, господа!

Не хотелось бы плагины подключать сторонние.
Обычно я делаю это только если нельзя решить задачу стандартными средствами НСИС.

Но ${WordFind} что-то сложная штука.
Мне непонятны опции. Задача искать заданное слово во всём текстовом файле, независимо ни от количества строк, ни от чего. Какой параметр надо для этого задать я не пойму.

Что означают параметры +2}}, +2*}, -02, E+1{ и т.д.

BuZzOFF
05-02-2016, 08:30
По принципу: если есть фраза "version1.1", то один путь установки, если нет - другой путь. »
Задача искать заданное слово во всём текстовом файле, независимо ни от количества строк, ни от чего. »
Нужно зациклить. В теме есть примеры. На их основе накидал. Опять же без NSIS'а... Не могу проверить.
Как-то так...
Section
Call test
${If} $0 == 1
; если фраза найдена
${Else}
; если фраза не найдена
${EndIf}
SectionEnd

Function test
ClearErrors
${LineSum} "$DESKTOP\test.txt" $R0 ; в переменную $R0 заносим количество строк в файле
StrCpy $R1 0 ; обнуляем счетчик
read:
IntOp $R1 $R1 + 1 ; увеличиваем счетчик и читаем следующую строку
IntCmp $R1 $R0 0 0 end ; если значение текущей строки больше, чем общее количество строк в файле - переход на метку end
${LineRead} "$DESKTOP\test.txt" "$R1" $R3 ; читаем содержимое строки
${WordFind} "$R3" "version1.1" "E+1{" $R2 ; ищем фразу в строке
IfErrors read 0 ; если фраза не найдена - переход на метку read
StrCpy $0 1
end:
FunctionEnd

MKN
05-02-2016, 10:09
Не хотелось бы плагины подключать сторонние. »
Какие же это сторонние плагины ? Самые что ни на есть родные - NSIS_овские, которые просто обязаны быть у пользователя. :)
Что за проблема, добавить к имеющейся куче "боксовых" плагинов - ещё один или столько, сколько надо, и писать в скрипте одну-две строчки , вместо полутора десятков...

ps Как вариант, можно так :

OutFile "FileReadFromEnd_Test.exe"
!include "TextFunc.nsh"
!include "WordFunc.nsh"

Section
${FileReadFromEnd} "$EXEDIR\MyFile.txt" "Read"
IfErrors 0 +2
MessageBox MB_OK "Error (файл не найден)"
SectionEnd

Function Read
${WordFind} "$9" "version1.1" "E+1{" $1 ; $9-current line * http://nsis.sourceforge.net/FileReadFromEnd
IfErrors notfound found
found:
MessageBox MB_OK 'Found' IDOK end
notfound:
MessageBox MB_OK 'Not found'
end:
Push $0
FunctionEnd
здесь MessageBox - для наглядности результата построчного поиска "version1.1" , в MyFile.txt (начало поиска - почему то с нижней строки)

Serg866
05-02-2016, 14:03
BuZzOFF, MKN
Ещё раз спасибо, всё разжевали мне.


P.S: нашёл ещё такой вариант
http://nsis.sourceforge.net/Search_for_text_in_file
------------------------------------


единственная проблема:
если текстовик большого размера (5 мб например),
то инсталлер виснет...
Может быть есть решение специально для больших текстовиков?

MKN
05-02-2016, 15:42
единственная проблема:
если текстовик большого размера (5 мб например), то инсталлер виснет...
Может быть есть решение специально для больших текстовиков? »
Это что же за задача такая , где надо использовать такие огромные текстовые файлы ? :) Неужели более неоткуда взять несчастный номер версии ?
Для больших файлов можно использовать изврат с плагином nsisFile. Искать HEX значение искомой строки , "внутри" файла (version1.1 - берём в шестнадцатиричном виде).
Находит пулей.

K.A.V.
05-02-2016, 18:08
если текстовик большого размера (5 мб например),
то инсталлер виснет... »
Он не виснет, он долго думает
Дело, в общем то, не в размере файла, а в количестве строк, давно всем известная проблема NSIS - он не может с одинаковой скоростью читать каждую строку по мере сдвига от начала, говоря простым языком - при использовании команд типа LineRead происходит замедление скорости чтения в зависимости от позиции читаемой строки
Попробуйте написать код с отображением порядкового номера читаемой строки и вы увидите, сколько примерно строк NSIS будет читать без понижения скорости

Serg866
06-02-2016, 04:10
Это что же за задача такая , где надо использовать такие огромные текстовые файлы ? Неужели более неоткуда взять несчастный номер версии ?
Для больших файлов можно использовать изврат с плагином nsisFile. Искать HEX значение искомой строки , "внутри" файла (version1.1 - берём в шестнадцатиричном виде).
Находит пулей. »
Ну этот файл - лог закачек. И у каждого юзера этот файл может быть очень большого размера, в зависимости от того сколько контента он скачивал. Вот мне нужно определить наличие в этом логе инфы о скачивании моей программы. Кроме version1.1 там есть ещё название проги.

Попробую nsisFile, благо там есть юникод-версия плагина.
То есть надо определить хекс-значение заданной фразы и прописать это значение, используя nsisFile::FileFindBytes ?
-----------------------

Serg866
06-02-2016, 04:54
Он не виснет, он долго думает
Дело, в общем то, не в размере файла, а в количестве строк, давно всем известная проблема NSIS - он не может с одинаковой скоростью читать каждую строку по мере сдвига от начала, говоря простым языком - при использовании команд типа LineRead происходит замедление скорости чтения в зависимости от позиции читаемой строки
»
А можно какой-либо прогресс-бар или же просто сообщение типа "ждите" прикрутить на время обработки файла? Чтоб юзер не думал что установщик завис.

P.S: я почему подумал что завис инсталлер - в диспетчере задач процесс стал жрать большое количество ресурсов и я его вырубил.

K.A.V.
06-02-2016, 07:26
А можно какой-либо прогресс-бар или же просто сообщение типа "ждите" прикрутить на время обработки файла? Чтоб юзер не думал что установщик завис. »
Можете стандартный баннер заюзать, но он маленький по размеру
Либо используйте другие баннеры типа Nxs plug-in (http://nsis.sourceforge.net/Nxs_plug-in)
Пример с баннером при поиске файлов:


!include "WinMessages.nsh"
!include "FileFunc.nsh"

Name "TEST"
OutFile "TEST.exe"



Function .onInit
Banner::show ""
Banner::getWindow
Pop $R1
GetDlgItem $R2 $R1 1030
${Locate} "$WINDIR" "/L=F" "LocateCallBack"
Banner::destroy

quit
FunctionEnd


Function LocateCallBack
SendMessage $R2 ${WM_SETTEXT} 0 "STR:$R7"
Push $0
FunctionEnd


Section
SectionEnd

MKN
06-02-2016, 09:10
То есть надо определить хекс-значение заданной фразы и прописать это значение, используя nsisFile::FileFindBytes ? »
Да

Serg866
10-02-2016, 05:11
Дорогие знатоки NSIS и конечно маэстро K.A.V., хочу у вас проконсультироваться относительно файла hosts
То, что мне нужно описано вот в этом примере :
http://forum.oszone.net/post-2507451-1625.html

А вопрос следующий: как такую операцию с изменением файла hosts проделать "втихарца", чтобы ни антивирусы, ни сама система не ругались? Ведь файл-то системный и по сути один из ключевых...
И сопутствующие вопросы - имеет ли значение версия системы 32-битная или 64-битная?
И важен ли тут атрибут RequestExecutionLevel admin, который прописываю в скрипте?

Ну и быть может есть альтернативные способы как заблокировать доступ к сайту с помощью NSIS (без редактирования файла hosts)?

Заранее спасибо, коллеги.

MKN
10-02-2016, 11:21
Ведь файл-то системный »
Надо стать владельцем файла, получить к нему полный доступ. Версия ОС значения не имеет. RequestExecutionLevel - в зависимости от задачи.
быть может есть альтернативные способы как заблокировать доступ к сайту с помощью NSIS (без редактирования файла hosts)? »
Командой из скрипта создать правило для брандмауэра. На предыдущей страницы уже была ссылка на примеры.
Насчёт ругани антивирусов - это уже сам пользователь пусть укрощает "дурость" своего антивируса. Против дури лекарства нет... :)

Serg866
11-02-2016, 02:04
Надо стать владельцем файла, получить к нему полный доступ. Версия ОС значения не имеет. RequestExecutionLevel - в зависимости от задачи. »
Задача с помощью NSIS заблокировать всем браузерам доступ к одному конкретному сайту.
Ну а как получить доступ? Недостаточно того что инсталлер запускается из под администратора?

Командой из скрипта создать правило для брандмауэра. На предыдущей страницы уже была ссылка на примеры.
Насчёт ругани антивирусов - это уже сам пользователь пусть укрощает "дурость" своего антивируса. Против дури лекарства нет... »
Как правило мало кто укрощает антивирус.
Обычно сразу закрывают прогу и спешно удаляют её.

NSIS Simple Firewall Plugin не поддерживает юникод, а мне нужен юникод
LiteFirewall Plugin вроде не может добавлять блокировку сайта.
Команды из скрипта я не разобрал, но там сразу написано что документация для всех новых систем. А мне надо чтобы и в XP тоже работала блокировка сайта.

MKN
11-02-2016, 10:51
Недостаточно того что инсталлер запускается из под администратора? »
Для XP достаточно. Для старших ОС - нет.
Ну а как получить доступ? »
Есть плагины, есть системные команды.
Как правило мало кто укрощает антивирус. Обычно сразу закрывают прогу и спешно удаляют её. »
Мало кто из разработчиков ПО предупреждает пользователей о возможной неадекватной реакции антивируса на их продукт. И тем более никто не даёт внятных рекомендаций, что пользователю делать. Это - хреновые разработчики, раз им плевать, что их продукт сразу же будет удалён из за тупости какого то антивируса... Да и пользователи такие же...

Если с Firewall_ами не получается, используй записи в hosts.

ps Попробуй запускать из скрипта - Hosts Commander
Это гораздо лучше, чем горожа из NSIS кода.
http://code.google.com/archive/p/hostscmd/
http://habrahabr.ru/post/109180/

Serg866
11-02-2016, 15:23
ps Попробуй запускать из скрипта - Hosts Commander
Это гораздо лучше, чем горожа из NSIS кода.
http://code.google.com/archive/p/hostscmd/
http://habrahabr.ru/post/109180/ »

Спасибо.
Hosts Commander вроде подходит.
Но опять же как на него реагируют системы старше XP и основные антивири.
Бьют тревогу или нет. Может кто юзал?

upd: почитал комменты на хабре.
Не буду юзать...

MKN
11-02-2016, 15:30
upd: почитал комменты на хабре.
Не буду юзать... »
Посмотри на даты комментов. Многое уже изменилось. Да и вообще - никогда не верь комментам, пока не проверишь сам :)
Зря я эту ссылку дал...




© OSzone.net 2001-2012