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.
13-08-2015, 16:47
Что нужно прописать, чтобы само не добавлялось Wow6432Node? »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => SetRegView

динозавра
13-08-2015, 17:09
Оперативно. Но на изучение уйдет много времени, а мне нужно всего лишь помощь в коректировке уже рабочего экзешника, не изучая досконально язык програмирования. Как говорил мой дед: "спасибо, что не отказали в помощи".

K.A.V.
13-08-2015, 17:19
Но на изучение уйдет много времени »
На прочтение 5 строчек в описании команды у вас уйдёт много времени? :o
"Сделайте мне быстро и чтобы я не вникал ни во что" - это так заказы оформляются на фрилансерных сайтах, вам туда с такими сообщениями и подходом

динозавра
13-08-2015, 17:32
Извените. Но я не то имел ввиду. Если всавить код. то выдает по очереди два сообщения типа х86 ок и за ним х64 - ок. Я хотел автомат без окошек с ок.

MKN
13-08-2015, 17:43
динозавра,
Приведи здесь свой код и чётко поставь задачу.

динозавра
13-08-2015, 17:54
Вот

Section main
${If} ${RunningX64}
SetRegView 32
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files
${Else}
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
MessageBox MB_OK $0 # C:\Program Files
${EndIf}

WriteRegStr HKLM "SOFTWARE\Proba" "Proba" "00000000"

SectionEnd

Мне нужно, чтобы запись велась в SOFTWARE\Proba без запросов и на х32 и на х64

K.A.V.
13-08-2015, 17:56
Приведи здесь свой код и чётко поставь задачу. »
Да тут всё понятно, человек не знает ничего о NSIS, не может прочитать описание команды и вставить одну строку перед своими командами по записи данных в реестр, чтобы записалось всё не в Wow6432Node, потом взял кусок кода из описания команды SetRegView и не может понять, как убрать сообщения с мессаджами...

динозавра, читайте справочник от корки до корки
По поводу вопроса: чтобы данные не писались в Wow6432Node, нужно установить тип доступа в реестр (а инсталляторы, которые создаёт NSIS - 32 разрядные приложения, поэтому и доступ у них перенаправляется в Wow6432Node раздел), необходимо перед командами записи в реестр добавить команду SetRegView 64

SetRegView 64
WriteRegStr HKLM "Software\TEST" "Параметр" "Значение"

динозавра
13-08-2015, 18:09
Да, конечно я нуб в этом и это мой второй экзешник.
Я не занимаюсь програмированием. Просто по быстрячку хотел поэкпериментировать и ждал от вас именно этой подсказки, за что огромная всем откликнувшимся благодарность.
Когда закончится в поле вся работа, ближе к зиме - займусь плотнее NSIS.

MKN
14-08-2015, 16:00
Интересно, как можно попроще решить такую задачу ? :

Наводим курсор на изображение - это изображение заменяется другим (ну и курсор при наведении меняется, становится "ладошкой")
Кликаем на изменившемся изображении ПКМ - получаем Callback.
Возможно ли здесь обойтись без таймера ?

kotkovets
15-08-2015, 21:10
Интересно, как можно попроще решить такую задачу ? : »
никак проще, 3 тонны кода, вагон и тележка с надписью: поехали

K.A.V.
16-08-2015, 01:02
Интересно, как можно попроще решить такую задачу ? »
С такими хотелками проще бросить NSIS и начать писать полноценно на WinAPI, поверь, там не так всё сложно, как может показаться на первый взгляд, +возможностей просто куча
На худой конец, написать плагин...

Наводим курсор на изображение - это изображение заменяется другим »
Попробовал на скоряк поставить элемент Label/Bitmap на OnNotify в nsDialogs (по аналогии как здесь (http://forum.oszone.net/post-2529829-1690.html) с ListView) - ничего в callback не прилетает, как я понял из MSDN, у Static должен быть стиль SS_NOTIFY для обработки сообщений, чтобы обрабатывался хотя бы клик мыши - присвоил стиль и всё-равно ничего не прилетает, не стал дальше разбираться

Возможно ли здесь обойтись без таймера ? »
А с таймером ты уже сделал такое?
Увы, но на WinAPI нет ничего готового, нет никаких плюшек для автоматизации какого-то действия, так что для всего того, что ты описал, ты должен будешь сделать всё вручную, а именно:
1. Получить текущие координаты позиции курсора мыши
2. Получить координаты элемента с изображением
3. Вычислить, если координаты из п1 входят в диапазон координат п2, то курсор над изображением
4. Вручную, опять же, присвоить изображение
5. Обработать нажатие ПКМ на изображении тоже должен сам, если пришло такое сообщение - делаешь то, что нужно

Я бы, наверное, просто закинул это дело в плаг и попробовал бы создать элемент изображения в самой dll и там же всё это обрабатывать в своей процедуре...Но это будет мягко говоря не удобно, создавать dll для одного элемента :)

Vincent7
16-08-2015, 17:59
Кто нибудь юзал вот это
http://nsis.sourceforge.net/NullsoftDecompiler
Работает? У меня на выходе получается белиберда..

MKN
16-08-2015, 19:06
С такими хотелками проще бросить NSIS »
Эээээ.... А чего я такого несбыточного спросил ? :)
А с таймером ты уже сделал такое? »
Ну да... Только чуется мне , что и без таймера можно обойтись... :) Там , где таймер, всегда какие то глюки...
3 тонны кода, вагон и тележка с надписью: поехали »
Да вроде и не так много кода... Но хотелось бы поменее, потому и поинтересовался как бы сделать попроще. Может макросом каким, или вообще по иному организовать идею...
Вот мой рабочий тестово- корявый :) код (для одной кнопки-изображения) :

!include "MUI2.nsh"
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "click_pict.exe"

Var dlg
Var Click
Var IMAGE
Var IMAGECTL
Var IMAGE2
Var IMAGECTL2

Function OnTimer
System::Alloc 16
Pop $0
System::Call USER32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call USER32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $Click
ShowWindow $IMAGECTL 1
ShowWindow $IMAGECTL2 0
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
${Else}
ShowWindow $IMAGECTL2 1
ShowWindow $IMAGECTL 0
${EndIf}
System::Call user32::RedrawWindow(i$Click,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
Pop $dlg

nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL
StrCpy $6 "$EXEDIR\a.bmp"
System::Call 'user32::LoadImage(i 0, t r6, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
ShowWindow $IMAGECTL 0

nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL2
StrCpy $7 "$EXEDIR\b.bmp"
System::Call 'user32::LoadImage(i 0, t r7, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE2
SendMessage $IMAGECTL2 ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE2
ShowWindow $IMAGECTL2 1

${NSD_CreateLabel} 135u 22u 40u 20u ""
Pop $Click
${NSD_OnClick} $Click OnClick
${NSD_CreateTimer} OnTimer 50

System::Call 'gdi32:DeleteObject(i $IMAGE)'
System::Call 'gdi32:DeleteObject(i $IMAGE2)'
nsDialogs::Show
FunctionEnd

Function OnClick
MessageBox MB_OK "Кликнули на изображении"
FunctionEnd

Section
SectionEnd


Как бы его причесать и упростить ?

ps Для чего это всё надо ? А чтобы в ногу со временем идти и для разнообразия :). Чтобы делать страницы, оформленные в стиле Metro интерфейса. При наведении курсора - вокруг кнопки (а это - цветное изображение прямоугольника на цветном фоне) появляется рамочка, чтобы был виден выбор этой кнопки, затем клик и действие. Ладошка курсора - это приятная и полезная мелочь.
Хорошо бы всё это загнать в DLL... Вполне реально и полезно... Но с dll мне не справиться... Вся надежда на вас, на гуру. :)

K.A.V.
16-08-2015, 22:15
Эээээ.... А чего я такого несбыточного спросил ? »
Дело не в "несбыточности", а в том, что такой функционал писать лучше отдельной DLL, почему - уже объяснили, тонна кода, который при всём необходимом функционале будет работать через костыли. Но это касается не всех элементов, а конкретно твоего - "статика", т.к. по стандарту статик не обрабатывает перемещение курсора мыши над собой, а отловить такое можно только (если делать правильно, а не "лишь бы работало") через подмену стандартной процедуры элемента, в которой и будет находиться весь код. Может, я как-то неправильно выражаюсь, "уж простите, не программисты мы" :)
Короче говоря, в твоём вопросе в пределах NSIS-кода для элемента статика - только таймер
Может, конечно, найдёшь другой метод, но я не в курсе, как это ещё можно сделать

Как бы его причесать и упростить ? »
Ну, если брать этот код - я бы посоветовал удалить 2 лишних элемента, у тебя для одной кнопки создаётся аж 3 элемента, зачем, когда можно обойтись одним?



!include "MUI2.nsh"
Page custom nsDialogsPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
OutFile "click_pict.exe"

Var dlg
Var Click
Var IMAGE
Var IMAGECTL
Var IMAGE2
Var IMAGECTL2

Function OnTimer
System::Alloc 16
Pop $0
System::Call USER32::GetCursorPos(ir0)
System::Call *$0(i.r1,i.r2)
System::Free $0
System::Call USER32::WindowFromPoint(ir1,ir2)i.r1
${If} $1 = $IMAGECTL
System::Call USER32::LoadCursor(i,i32649)i.s
System::Call USER32::SetCursor(is)
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE
${Else}
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE2
${EndIf}
System::Call user32::RedrawWindow(i$Click,i0,i0,i0x0105)
FunctionEnd

Function nsDialogsPage
nsDialogs::Create 1018
Pop $dlg

nsDialogs::CreateControl STATIC ${WS_VISIBLE}|${WS_CHILD}|${WS_CLIPSIBLINGS}|${SS_BITMAP} 0 140u 20u 48u 32u ""
Pop $IMAGECTL
StrCpy $6 "$EXEDIR\a.bmp"
System::Call 'user32::LoadImage(i 0, t r6, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE
SendMessage $IMAGECTL ${STM_SETIMAGE} ${IMAGE_BITMAP} $IMAGE

StrCpy $7 "$EXEDIR\b.bmp"
System::Call 'user32::LoadImage(i 0, t r7, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
Pop $IMAGE2

${NSD_AddStyle} $IMAGECTL ${SS_NOTIFY}
${NSD_OnClick} $IMAGECTL OnClick
${NSD_CreateTimer} OnTimer 50

nsDialogs::Show
System::Call 'gdi32:DeleteObject(i $IMAGE)'
System::Call 'gdi32:DeleteObject(i $IMAGE2)'
FunctionEnd

Function OnClick
MessageBox MB_OK "Кликнули на изображении"
FunctionEnd

Section
SectionEnd



Хорошо бы всё это загнать в DLL... Вполне реально и полезно... Но с dll мне не справиться... Вся надежда на вас, на гуру. »
Для меня то код здесь накидать - великое дело в последнее время, а что уж говорить про написание dll...мне над креатором ещё работать не знаю сколько, так что на меня можно не надеяться :)

kotkovets
17-08-2015, 14:48
LOKYOXY, уберите картинки под коврик, и что это хрень?

K.A.V.
18-08-2015, 17:49
и что это хрень? »
Найти все сообщения от LOKYOXY (http://forum.oszone.net/search.php?do=finduser&u=488770)
Человек, видимо, написал свой интерфейс в стиле "жизньболь" (ну, мне просто основной цвет не нравится :)) под NSIS, а этот пост - видимо, менеджер закачек на NSIS

MKN
18-08-2015, 18:49
Может, конечно, найдёшь другой метод »
Да, можно и без таймера - с помощью WndProc плагина. Наверное , это самое простое решение для этой задачи...

Iska
18-08-2015, 18:51
а этот пост - видимо, менеджер закачек на NSIS »
Лишь бы не очередной OpenCandy :).

Dodakaedr
19-08-2015, 15:07
Использую nsis3.0a2 подключил библиотеку RegistryFunc.nsh, взятую с справки.
Теперь сам вопрос: почему при вызове команды ${MoveKey}${MoveKey} "${HKCU}\Software\7-zip" "${HKCU}\Software\7-zip2" при отсутствии исходного ключа все равно создается ключ? ${HKCU}\Software\7-zip2
Это глюк библы или я не правильно что-то использую?

kotkovets
19-08-2015, 15:22
при отсутствии ключа все равно создается ключ? »
из справки:
Если нужно переместить в другой ключ, который не существует - ключ будет создан.
---
Если ключ реестра, который нужно переместить, не существует, то устанавливается флаг ошибки
---
Вообще библиотека заточена под NSIS 2.46 ANSI версии.




© OSzone.net 2001-2012