Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Что нужно прописать, чтобы само не добавлялось Wow6432Node? »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Перевод справки NSIS => SetRegView
динозавра
13-08-2015, 17:09
Оперативно. Но на изучение уйдет много времени, а мне нужно всего лишь помощь в коректировке уже рабочего экзешника, не изучая досконально язык програмирования. Как говорил мой дед: "спасибо, что не отказали в помощи".
Но на изучение уйдет много времени »
На прочтение 5 строчек в описании команды у вас уйдёт много времени? :o
"Сделайте мне быстро и чтобы я не вникал ни во что" - это так заказы оформляются на фрилансерных сайтах, вам туда с такими сообщениями и подходом
динозавра
13-08-2015, 17:32
Извените. Но я не то имел ввиду. Если всавить код. то выдает по очереди два сообщения типа х86 ок и за ним х64 - ок. Я хотел автомат без окошек с ок.
динозавра,
Приведи здесь свой код и чётко поставь задачу.
динозавра
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
Приведи здесь свой код и чётко поставь задачу. »
Да тут всё понятно, человек не знает ничего о NSIS, не может прочитать описание команды и вставить одну строку перед своими командами по записи данных в реестр, чтобы записалось всё не в Wow6432Node, потом взял кусок кода из описания команды SetRegView и не может понять, как убрать сообщения с мессаджами...
динозавра, читайте справочник от корки до корки
По поводу вопроса: чтобы данные не писались в Wow6432Node, нужно установить тип доступа в реестр (а инсталляторы, которые создаёт NSIS - 32 разрядные приложения, поэтому и доступ у них перенаправляется в Wow6432Node раздел), необходимо перед командами записи в реестр добавить команду SetRegView 64
SetRegView 64
WriteRegStr HKLM "Software\TEST" "Параметр" "Значение"
динозавра
13-08-2015, 18:09
Да, конечно я нуб в этом и это мой второй экзешник.
Я не занимаюсь програмированием. Просто по быстрячку хотел поэкпериментировать и ждал от вас именно этой подсказки, за что огромная всем откликнувшимся благодарность.
Когда закончится в поле вся работа, ближе к зиме - займусь плотнее NSIS.
Интересно, как можно попроще решить такую задачу ? :
Наводим курсор на изображение - это изображение заменяется другим (ну и курсор при наведении меняется, становится "ладошкой")
Кликаем на изменившемся изображении ПКМ - получаем Callback.
Возможно ли здесь обойтись без таймера ?
kotkovets
15-08-2015, 21:10
Интересно, как можно попроще решить такую задачу ? : »
никак проще, 3 тонны кода, вагон и тележка с надписью: поехали
Интересно, как можно попроще решить такую задачу ? »
С такими хотелками проще бросить 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
Работает? У меня на выходе получается белиберда..
С такими хотелками проще бросить 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 мне не справиться... Вся надежда на вас, на гуру. :)
Эээээ.... А чего я такого несбыточного спросил ? »
Дело не в "несбыточности", а в том, что такой функционал писать лучше отдельной 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, уберите картинки под коврик, и что это хрень?
и что это хрень? »
Найти все сообщения от LOKYOXY (http://forum.oszone.net/search.php?do=finduser&u=488770)
Человек, видимо, написал свой интерфейс в стиле "жизньболь" (ну, мне просто основной цвет не нравится :)) под NSIS, а этот пост - видимо, менеджер закачек на NSIS
Может, конечно, найдёшь другой метод »
Да, можно и без таймера - с помощью WndProc плагина. Наверное , это самое простое решение для этой задачи...
а этот пост - видимо, менеджер закачек на 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC