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
06-01-2016, 10:31
показывать текст в зависимости от языка инсталлера »
Для того ведь и делают собственные MessageBox с любыми кнопками и любым на них текстом на любом языке с любыми зависимостями...
В чём проблема... И при SilentInstall_е всё работает, если внятно поставить задачу...

ps К слову, о гибкости NSIS. Сам NSIS + Plugins + необходимые дополнения - и можно сделать практически всё, что душе угодно. :) Лучше нет ни одного подобного инсталлятора, тем более бесплатного... (разве что Inno на пятки наступает... ( но тут уже виноваты ленивые разработчики NSIS и не менее ленивые пользователи_nsis_программеры, которые упорно не хотят улучшать и расширять функционал NSIS :) )

Serg866
08-01-2016, 19:05
Почему-то некоторые антивирусы ругаются на инсталлеры НСИС. Авира и Аваст.

MKN
09-01-2016, 09:15
Почему-то некоторые антивирусы ругаются на инсталлеры НСИС. Авира и Аваст. »
Если бы они (и все остальные) только на NSIS ругались... Брешут ведь, как дурные собаки почти на всё что увидят... :)
Обычное дело для антивирусов , не блещущих интеллектом... :)
Тут поможет только проверенный способ - добавить "угрозу" в исключения антивируса. Но ничто не поможет, если у пользователя параноидальный страх преред любым сообщением антивируса... :)

lavey13
21-01-2016, 20:21
Доброго времени суток господа. Подскажите пожалуйста по вопросу решение которого пока не удается найти. Суть в следующем. Есть несколько nsi скриптов, главный выступает в роли интерфейса с кнопками и некоторым небольшим функционалом, также есть отдельно написанные nsi скрипты, которые я вызываю через exewait из скрипта-интерфейса. Вопрос в следующем, можно ли как то эти отдельные скрипты сразу включить в основной? По принципу подключения плагинов или nsh файлов? Т.к. хочется иметь на выходе один Exe, а не 4 например. Я конечно понимаю, что можно все в один код попробовать перенести, но это осложняется суммарно большим количеством кода, переменных, функций и соответственно большими временными затратами на отладку. Хотелось бы найти более практичный метод. Заранее спасибо.

Dodakaedr
21-01-2016, 23:51
Помогите, пожалуйста, написать правильный код поиска ключа. Пытался что-то из примера из справки сообразить, но честно говоря не до конца понимаю тот пример. Задача состоит в том чтобы найти ключ по его части имени. outfile "test find key.exe"
!include "Registry.nsh"
!include "logicLib.nsh"

section main
;создание ключа для примера
${registry::Write} "HKLM\SOFTWARE\Classes\CLSID\{EF67C328-46СС-87D7-EA63-D8A946C17D7D}" "" "" "REG_SZ" $8
${registry::Unload}
${registry::Open} "HKLM\SOFTWARE\Classes\CLSID" "/K=1 /G=0 /V=0 /S=0 /NS='46СС'" $0
${DoUntil} $0 = 0
${registry::Find} $0 "$1" "$2" "$3" "$4"
StrCpy $9 "$1" 4 -24
StrCmp $9 '46СС' finish loop
finish:
;${IfThen} "$9" == "" ${|}${Break}${|} # поиск завершен, выход из цикла
${|}${Break}${|}
;StrCmp $9 '46СС' 0 +2
MessageBox mb_ok|mb_iconinformation 'Ключ: $1'
loop:
${loop}
${registry::Unload}
sectionend

Dodakaedr
24-01-2016, 19:24
Есть какой-то макрос получения ID элемента чужого окна? При запуске чужой программы ID элементов постоянно меняется(в моем случаи id кнопок постоянно разные при запуске чужой программы). Или подскажите, пожалуйста, какие есть еще способы получения хендла кнопок, кроме как GetDlgItem?

K.A.V.
24-01-2016, 20:30
также есть отдельно написанные nsi скрипты, которые я вызываю через exewait из скрипта-интерфейса. Вопрос в следующем, можно ли как то эти отдельные скрипты сразу включить в основной? По принципу подключения плагинов или nsh файлов? »
Так а в чем проблема то? Берёте содержимое не из основного скрипта и запихиваете в отдельный файл с расширением nsh, в основном скрипте инклудите этот файл и всё. Привели бы пример, как у вас там всё выглядит, просто нужно распихать всё по функциям как нужно и в основном скрипте лишь делать вызов конкретных функций

Пример:
Основной файл скрипта
!include "MyFile.nsh" ; инклудим файл, который лежит рядом с основным скриптом, из этого файла вызовем функцию

Name "TEST"
OutFile "TEST.exe"

Function .onInit
call Function_MyFile ; вызываем функцию из MyFile.nsh
MessageBox MB_OK|MB_ICONINFORMATION "$myvar"
FunctionEnd

Section
SectionEnd

MyFile.nsh
var myvar

Function Function_MyFile
StrCpy $myvar "TEST TEXT"
FunctionEnd

Есть какой-то макрос получения ID элемента чужого окна? »
ID это вы имеете в виду хэндл или идентификатор элемента, который сам разработчик назначает элементу и который прописан в ресурсах?

какие есть еще способы получения хендла кнопок, кроме как GetDlgItem »
Перебором с поиском по типу элемента с помощью FindWindowEx с указанием класса элемента (Button, ComboBox, Edit, Static и т.д.) и имени окна, имя окна у кнопки вроде бы - это её текст (могу ошибаться, отвечаю по памяти, не помню точно, так это или нет)
Какая задача перед вами стоит? Что требуется делать с кнопками?

Dodakaedr
24-01-2016, 22:46
K.A.V., Какая задача перед вами стоит? Что требуется делать с кнопками?
Нужно определить идентификатор кнопки, который указывает разработчик, а потом её нажать. Задача то простая, но есть маленькое "но". В моём случаи идентификатор кнопки генерируется при каждом запуске проги новый, что не позволяет точно определить идентификатор(ID) кнопки. Покажите, пожалуйста, пример использования winapi функции findwindowex.

K.A.V.
25-01-2016, 07:58
Dodakaedr, прочитайте в оригинальной справке к NSIS описание команды FindWindow, юзать winapi не обязательно, вам нужно будет написать цикл while и в команде поиска окна указывать в качестве родителя предыдущее найденное окно. Попробуйте написать код сами

MKN
26-01-2016, 10:49
Dodakaedr, идентификатор кнопки генерируется при каждом запуске проги новый »
Без API наверное не обойтись... В частности - EnumChildWindows. Был хороший макрос, перечисляющий параметры элементов окна. Не то в справочнике, не то на nsis.sourceforge.net...
При меняющихся ID элементов, можно как вариант, скинуть все найденные ID в переменную, а потом, выбирать нужный ID, исходя из порядкового номера элемента.

lavey13
26-01-2016, 15:57
Подскажите еще по такому вопросу. Использую плагин NsisCrypt, при шифровании - дешифровании текста, на моем ПК приложение работает корректно. При запуске его на других ПК появляется ошибка "Error while acquiring Windows CryptoAPI context". Вроде как есть решение, есть баг репорт, но совершенно не пойму как его использовать. Был бы очень благодарен если поможете разобраться.
https://sourceforge.net/p/angabin/bugs/1/

MKN
26-01-2016, 17:00
lavey13,
Похоже, это баг самого плагина.
уже обсуждалось :
http://stackoverflow.com/questions/17612740/nsiscrypt-returns-error-while-acquiring-windows-cryptoapi-context-on-all-but-d
там же, вроде как и предложен фикс для NsisCrypt.cpp

lavey13
26-01-2016, 17:02
MKN, то есть нужно брать код этого фикса, заменить в исходнике NsisCrypt.cpp и скомпилировать весь проект плагина в dll?

MKN
26-01-2016, 17:04
lavey13,
получается, именно так...

ZaxBoys66
26-01-2016, 20:39
NSIS How to send Email with CMD use bmail.exe or blat.exe

My example not work

ExecWait '"$SYSDIR\cmd.exe" /c $PLUGINSDIR\bmail.exe "bmail -s smtp.mail.yahoo.com -p 587 -t myemail@yahoo.com -f fromemail@yahoo.com -h -a NSIS -b Not Work..."'

MaGoth
27-01-2016, 21:54
Хм. народ вопрос имеется по ини-шкам..
Все правится меняется это хорошо, одна бяда, строки уезжают в конец секции.
Как внести изменения в файл без танцев с бубнами и переездом строк на новое местоположение ?!

Кусок примера инишки значения параметров которые надо изменить.:
[ENGINE]
...
zTexCacheOutTimeMSec=240000
zTexCacheSizeMaxBytes=100000000
zSndCacheOutTimeMSec=10000
zSndCacheSizeMaxBytes=20000000
...


У кого какие мысли есть ?!

K.A.V.
29-01-2016, 17:19
Dodakaedr, я персонально в личке никому не отвечаю по NSIS, зачем тогда нужен форум?
Я же вам тут написал, при поиске указывайте в качестве родителя предыдущее найденное окно и прочитайте описание команды FindWindow в оригинальной справке, я же не просто так это всё написал.
Ну, а раз вам перечисление не нужно и текст на кнопке не меняется, то вам и цикл не нужен
Ваш код должен быть таким:

FindWindow $0 "" "ИМЯ ОКНА ПОДСТАВЬТЕ сами, модеров форума не хочу смущать :)"

FindWindow $1 "${WNDCLASS}" "${WNDTITLE}" $0
FindWindow $2 "${WNDCLASS}" "${WNDTITLE2}" $0

SendMessage $1 ${BM_CLICK} 0 0
SendMessage $2 ${BM_CLICK} 0 0
SendMessage $0 ${WM_CLOSE} 0 0
Что делает этот код:
При указании 3-го параметра в команде FindWindow, мы заставляем искать наши кнопки в конкретном окне-родителе, т.е. в окне вашего приложения
Если не понимаете суть родительских-дочерних окон и как это всё устроено - советую почитать инфу на просторах интернета, чтобы было понимание, как всё это дело в винде устроено

MKN
29-01-2016, 17:36
K.A.V.,
FindWindow [HWND] [Class] [Title] работает почему то далеко не со всякими окнами... Есть окна (особливо в некоторых кейгенах), где даже с элемента на элемент нельзя переместиться никакими силами (ни конкретным указанием на, как будто найденные параметры элемента, ни эмуляцией нажатий стрелок, Tab_а и пр.)

K.A.V.
30-01-2016, 08:44
FindWindow [HWND] [Class] [Title] работает почему то далеко не со всякими окнами... Есть окна (особливо в некоторых кейгенах), где даже с элемента на элемент нельзя переместиться никакими силами (ни конкретным указанием на, как будто найденные параметры элемента, ни эмуляцией нажатий стрелок, Tab_а и пр.) »
Это зависит уже не от FindWindow, а от того, как программист реализовал работу окна с элементами, можно отключить переход по элементам по Tab и вообще, все события можно перехватывать в процедуре окна, но думаю, ты об этом уже знаешь. Так что тут нужно смотреть по конкретному приложению, как оно написано

Насчет перебора допустим, кнопок, вот вам код, как это должно выглядеть, может кому пригодится
Пример на поиске кнопок и определения их текста в окне MakeNSISW (GUI-комплиятор в папке NSIS)

!include "LogicLib.nsh"
!include "WinMessages.nsh"

Name "TEST"
OutFile "TEST.exe"

Function .onInit
StrCpy $1 "1" ; Чтобы while с первого же раза не закрылся
FindWindow $0 "#32770" "MakeNSISW"
IsWindow $0 +3 0 ; проверка на существование окна
MessageBox MB_OK|MB_ICONSTOP "Окно MakeNSISW не найдено"
quit

${While} $1 != "0" ; когда кнопок больше не останется - выход из цикла
FindWindow $1 "Button" "" $0 $2 ; $0 - указываем, что мы будем искать кнопки в окне MakeNSISW, т.е. указываем окно-родителя, $2 - мы указываем предыдущую найденную кнопку, чтобы не стоять на месте с определением первой кнопки
SendMessage $1 ${WM_GETTEXTLENGTH} 0 0 $4 ; получаем количество символом текста на кнопке
IntOp $4 $4 + 1 ; к количеству символов текста на кнопке прибавляем 1, т.к. кнопки у нас с "&"
System::Call 'User32::GetWindowText(i$1, t.r3, i$4)' ; получаем текст на кнопке
StrCpy $2 $1 ; помещаем в переменную $2 HWND найденной кнопки, чтобы продолжить поиск кнопок с этой найденной кнопки
IsWindow $1 0 +2 ; проверяем существование кнопки, чтобы в конце определения не получить лишний мессадж
MessageBox MB_OK|MB_ICONINFORMATION "HWND кнопки: $1$\nТекст на кнопке: '$3'"
${EndWhile}
quit
FunctionEnd

Section
SectionEnd


Пример на поиске кнопки "Close" в MakeNSISW (GUI-комплиятор в папке NSIS)

!include "LogicLib.nsh"
!include "WinMessages.nsh"

Name "TEST"
OutFile "TEST.exe"

Function .onInit
StrCpy $1 "1" ; Чтобы while с первого же раза не закрылся
FindWindow $0 "#32770" "MakeNSISW"
IsWindow $0 +3 0 ; проверка на существование окна
MessageBox MB_OK|MB_ICONSTOP "Окно MakeNSISW не найдено"
quit

${While} $1 != "0" ; когда кнопок больше не останется - выход из цикла
FindWindow $1 "Button" "" $0 $2 ; $0 - указываем, что мы будем искать кнопки в окне MakeNSISW, т.е. указываем окно-родителя, $2 - мы указываем предыдущую найденную кнопку, чтобы не стоять на месте с определением первой кнопки
SendMessage $1 ${WM_GETTEXTLENGTH} 0 0 $4 ; получаем количество символом текста на кнопке
IntOp $4 $4 + 1 ; к количеству символов текста на кнопке прибавляем 1, т.к. кнопки у нас с "&"
System::Call 'User32::GetWindowText(i$1, t.r3, i$4)' ; получаем текст на кнопке
StrCpy $2 $1 ; помещаем в переменную $2 HWND найденной кнопки, чтобы продолжить поиск кнопок с этой найденной кнопки
${If} $1 != "0" ; проверяем существование кнопки, чтобы в конце определения не входить лишний раз в if
${If} $3 == "&Close" ; если текст на кнопке "&Close" - это наша кнопка
MessageBox MB_YESNO|MB_ICONQUESTION "Кнопка Close найдена, нажимаем?" idno +2
SendMessage $1 ${BM_CLICK} 0 0
${EndIf}
${EndIf}
${EndWhile}
quit
FunctionEnd

Section
SectionEnd

Dodakaedr
30-01-2016, 19:56
Подскажите, существует ли плагин или макрос по работе с фаерволом (добавление, удаление и проверка правил)?




© OSzone.net 2001-2012