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
20-03-2023, 11:55
iglezz, подскажи пожалуйста, как поместить в собственное окно (CreateWindowEx) чекбоксы и кнопки ?
Про размещение текста инфа есть, про прочее - не нашёл... Вероятно нужен какой то спец стиль ?

iglezz
20-03-2023, 13:22
MKN, Все стандартные контролы создаются одинаково через CreateWindowEx (https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindowexw)/CreateWindow (https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-createwindoww), только у простого текста будет ClassName STATIC, у кнопки - BUTTON и т.д.

MKN
20-03-2023, 13:52
iglezz, т.е. в собственном окне, созданным с помощью CreateWindowEx, можно создать ещё 10 чекбоксов и кнопок ?
Хмм... Никак не получается...

iglezz
20-03-2023, 17:16
MKN, для вновь создаваемых окон-детей (в терминологии WinAPI) нужно в функции CreateWindowEx указать дескриптор окна-родителя.
В качестве микро-дополнения к моему примеру на прошлой странице: ${NSD_CreateCheckBox} 40u 5u 40u 20u "111.1"
Pop $hChildButton1
System::Call 'user32::SetParent(i$hChildButton1,i$hButtonOpt11)i.R0'

SetParent поменяет родителя с окна nsDialogs на кнопку $hButtonOpt11, координаты x,y будут задавать положение относительно нового родителя.
Тоже самое можно сделать и через System::Call 'user32::CreateWindowEx... + SendMessage ... ${WM_SETFONT}

Такие детки будут прятаться/показываться/перемещатся вместе с родителем.
Сразу проблема - навешивание функций-обработчиков через ${NSD_OnClick} и т.п. не работает для таких деток. Так как события получает родитель, который должен иметь обработчик этих событий. Обработчик написать не проблема, а вот как в nsis получить дескриптор функции-обработчика (необходим для установки функции обработчиком) - хз
Доступное костыльное решение (больше костылей богу костылей!) -- менять родителя туда-сюда (окно nsDialogs <--> своё окно)


Минимальный пример не помешал бы для более конструктивного обсуждения и во избежание путаницы в терминах. А ещё лучше - короткий рассказ, зачем городить такую жесть на столь ограниченной платформе как nsis :)

MKN
23-03-2023, 16:19
Подскажите, в чём проблема ? - не подключается !include "CommCtrl.nsh"
При компиляции ошибка :

!include: "CommCtrl.nsh" (UTF8)
Bad text encoding: CommCtrl.nsh:2
!include: error in script: "CommCtrl.nsh" on line 2

(на второй строке хедера всего лишь - !define COMMCTRL_INCLUDED )

Пробовал штук пять вариантов CommCtrl.nsh. Без результата.
NSIS 3.8.0.0 WINDOWS 7 X64

C NSIS 3.0 всё нормально

iglezz
23-03-2023, 16:57
!include: "CommCtrl.nsh" (UTF8)
Bad text encoding: CommCtrl.nsh »
Неверно распознало кодировку как UTF-8 и файл в итоге содержит некорректные для UTF-8 символы. Например в !define COMMCTRL_INCLUDED будет буква O,E,.. из кириллицы.
Архив с nsis.sourceforge.io/Header_file_for_Listview (https://nsis.sourceforge.io/Header_file_for_Listview) такой проблемы не имеет, CommCtrl.nsh там в кодировке ANSI/ACP (только пришлось самому дописать отсутствующий !define _COMMCTRL_NSH_VERBOSE 1)

Этот тип ошибок лечится принудительным указанием кодировки: !include /charset=кодировка файл

MKN
23-03-2023, 17:21
там в кодировке ANSI/ACP (только пришлось самому дописать отсутствующий !define _COMMCTRL_NSH_VERBOSE 1) »
Так я оттуда и использую... Может дело в отсутствующем !define _COMMCTRL_NSH_VERBOSE 1 ?
Куда его правильно конкретно дописать ? (или просто 3 заменить на 1...)

iglezz
23-03-2023, 17:39
MKN, После скачивания и распаковки попытка компиляции примерок ведёт к ошибке !verbose: Invalid verbose level
Error in macro __NSD_LV_InsertColumn_Call on macroline 2
А вторая строка в этом макросе - !verbose ${_COMMCTRL_NSH_VERBOSE}.
Т.е. ошибка в том что _COMMCTRL_NSH_VERBOSE не задан.

Сейчас уже вижу, что мой быстрый фикс с добавлением !define _COMMCTRL_NSH_VERBOSE 1 был слишком быстрый, а правильный способ - замена _COMMCTRL_NSH_VERBOSE на _COMMCTRL_VERBOSE.
Это явно было последнее изменение перед запаковкой, т.к. даже отступ изменён с двух пробелов на табуляцию в строках с _COMMCTRL_NSH_VERBOSE

После исправления примеры компилируются без ошибок.

MKN
23-03-2023, 17:47
iglezz,
У меня __NSD_LV_InsertColumn_Call on macroline 2 на 1292 строке...
Изменил в макросе на !verbose ${_COMMCTRL_VERBOSE}. Ошибка...

Может скинешь мне свой рабочий CommCtrl.nsh ? И с какой версией NSIS проверяешь ? С 3.0 ведь работает безо всяких правок...

А !verbose ${_COMMCTRL_NSH_VERBOSE} у мня в хедере 14 штук... Все изменять ?
- Изменил - ошибка та же...
Преобразовал хедер в UTF-8 - та же ошибка...

iglezz
23-03-2023, 18:16
MKN, использую страндартную 3.08

MKN
23-03-2023, 18:40
использую страндартную 3.08 »
Удалил 3.08, переустановил(с https://sourceforge.net/projects/nsis/files/latest/download), скопировал твой CommCtrl.nsh, компилю - не работает, та же ошибка...
Удалил, установил 3.0.6.1 и т.д. - всё работает...
(Скрипт для теста - ранее всегда рабочий и даже пробовал пустой, только с CommCtrl.nsh)
И что это такое ? :cool: Позже попробую на др. компе...

ps Если в 3.08 заменить файл Program Files (x86)\NSIS\Bin\makensis.exe файлом из 3.06 - всё работает.
Прочие файлы на работу вроде как не влияют...

iglezz
24-03-2023, 11:34
MKN, Есть у меня виртуалка с Win7x32 чистая 6.1.7601 без обновлений и модификаций - работает корректно. Проблема, видимо, зависит от каких-то специфичных вещей в конкретных сборках винды.
Такое лечить правильнее указанием кодировки !include /charset=...
В порядке предположения, судя по исходникам, 3.07 у тебя должна так же сбоить.

Сверху ещё можно накатить обнову с https://github.com/kichik/nsis/.
Как минимум забрать папку Include\ - исправлен баг в LogicLib.nsh и обновление WinVer.nsh (определение вин 11 и билдов вин10 после 2021 года)

MKN
24-03-2023, 12:15
Как минимум забрать папку Include\ - исправлен баг в LogicLib.nsh и обновление WinVer.nsh »
Я туда периодически заглядываю, забираю обновы. Хотя WinVer.nsh там уже устаревший... (Сам принцип определения W11 в нём наверное не совсем удачный... Обновлять всё время каждый чих MS... не есть хорошо.)
Также видел у китайцев версии(ими названные) 3.0.8.1 - и x86 и даже x64. Причём с защитой от взлома, (вероятно имеется ввиду защита от декомпилляции), там почти все файлы другие и фейс китайский. (Но CommCtrl.nsh и с ними у меня не работает... :( )

Flix
25-03-2023, 02:28
Также видел у китайцев версии(ими названные) 3.0.8.1 - и x86 »
Это компиляция с последними изменениями из официального хаба, с момента релиза 3.0.8, плюс свои фишки и плюшки.

и даже x64 »
Это компиляция на базе неофициальной NSIS 64-bit (https://github.com/negrutiu/nsis), плюс все то же что и у х86.

Причём с защитой от взлома, (вероятно имеется ввиду защита от декомпилляции) »
Измените в исходниках exeheader (fileform.cpp, fileform.c, fileform.h) и любой декомпилятор (автораспаковщик) обломается.
Вот как раз это и наблюдается в хидере инсталляторов, собранных китайской версией. :yes:

inco1
01-04-2023, 07:12
Всем доброго дня.
Подскажите пожалуйста, как правильно и оптимально кратко прописать проверку всех серверных версий, чтобы получилось примерно так: "Если запущено на любой серверной виндовс, то...".

${If} ${IsWin2003}
${orIf} ${IsWin2003R2}
${orIf} ${IsWin2008}
${orIf} ${IsWin2008R2}
${orIf} ${IsWin2012}
${orIf} ${IsWin2012R2}
${orIf} ${IsWin2016}
${orIf} ${IsWin2019}
${orIf} ${IsWin2022}
DetailPrint "Running on Windows Server"
${EndIf}

Не на чем проверить.

iglezz
01-04-2023, 11:06
Должно быть достаточно ${If} ${IsServerOS} ...

inco1
01-04-2023, 11:57
Компилируется, но не уверен, что определит 2019 и 2022. Ведь мой вариант с ${IsWin2019} и ${IsWin2022} даже не компилируется, а только компилируется без них. Использую последнюю WinVer.nsh с хитхаба.

Нашел выход через реестр. Да и в этом варианте WinVer.nsh применять не нужно. Думаю, что в реестре для всех же серверных версий прописано

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"InstallationType"="Server"

Function .onInit
Var /GLOBAL Server
ReadRegStr $Server HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "InstallationType"
FunctionEnd

Section
${If} $Server == Server
; ====Running on Windows Server"
${EndIf}
SectionEnd

iglezz
01-04-2023, 14:44
Компилируется, но не уверен, что определит 2019 и 2022 »
Информация по системе собирается при запуске nsis-инсталлятора (используя GetVersionEx (https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getversionexw)).
Так что будет определять, пока сами мелкомягкие не сломают.

Ведь мой вариант с ${IsWin2019} и ${IsWin2022} даже не компилируется »
Логично, т.к. такие определения ещё не добавлены в WinVer.nsh

Нашел выход через реестр. Да и в этом варианте WinVer.nsh применять не нужно. Думаю, что в реестре для всех же серверных версий прописано »
Использование готовых библиотек и системных API вместо прямого чтения реестра и прочих конфигурационных сущностей рекомендуется для того, чтобы не тратить силы на реализацию того, что уже реализовано и не зависеть от разнородных структур/форматов одного и того же, но в разных версіях.

Те же ${IsWin2019} и ${IsWin2022} (как и любые другие проверки) можно легко добавить.
И даже в основной пакет исправления/дополнения можно добавить -- патчи/пулреквесты принимаюся на github/sourceforge

inco1
02-04-2023, 10:00
iglezz, Приветствую. Тут еще появилась проблема. Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? Всё перерыл, ничего не подходит.

Begin2Fly
02-04-2023, 13:15
Можно как то прописать, чтобы екзешник не запускал себя повторно , если найден процесс с его именем? »
В справочнике NSIS есть раздел "Предотвращение множественности запуска" и "Работа с процессами с помощью NSIS", оба подойдут.




© OSzone.net 2001-2012