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

iglezz
19-08-2020, 10:38
Serg866,
Ух.. Мой косяк :(
${OrIf} надо заменить на ${AndIf}

Hoha
25-08-2020, 23:01
Подскажите, как узнать, на какой странице прервалась работа инсталлера, чтобы отправить событие в аналитику. OnUserAbort же не дает такой инфы? (если уместно, я бы попросил возмездной помощи в целом по установке)

iglezz
26-08-2020, 09:18
Hoha,
Можно объявить переменную (https://nsis.sourceforge.io/Docs/Chapter4.html#varuser) и использовать callback-функции страниц (https://nsis.sourceforge.io/Docs/Chapter4.html#pagecallbacks_explain) для установки в эту переменную некоего значения, по которому в .OnUserAbort можно будет определить точку, на которой пользователь захотел выйти.

Hoha
26-08-2020, 13:16
iglezz, Спасибо!

Есть еще проблема с накладыванием текста по требованиям свободного места на диске после каждого измнения пути установки. https://i.imgur.com/pfBk0nl.png
Сечас решили как

Function .onVerifyInstDir
LockWindow off
FunctionEnd

iglezz
26-08-2020, 16:06
Hoha, непонятно что за проблема с накладыванием текста. Тут надо пару скринов/анимация проблемы или компилируемый кусок скрипта.

MKN
20-10-2020, 13:13
Напомните пожалуйста, есть ли простой способ(код в одну строку :) ), чтобы удалить файлы из каталога, НЕ УДАЛЯЯ сам каталог ? (Что то мне кажется, что такового не существует в NSIS...) В две строки - удалив каталог с файлами и создав вновь- это как то топорно...

AlekseyPopovv
20-10-2020, 13:23
MKN, Delete "$DESKTOP\*.*"

MKN
20-10-2020, 13:40
AlekseyPopovv,
Мдя... Видел же в "Справочнике", под названием - "Удаление всех файлов с рабочего стола". Даже в голову не пришло, что оно и есть... :)

Begin2Fly
20-10-2020, 13:43
MKN, но обратите внимание, что таким образом удалятся только файлы, папки останутся на месте.

AlekseyPopovv
20-10-2020, 13:43
MKN, Я сразу понял что что то не то тут... :)

MKN
20-10-2020, 13:46
Begin2Fly,
Действительно, любопытное поведение... А для удаления и папок, вроде как макрос какой то был...

AlekseyPopovv
21-10-2020, 16:27
Есть ли способ создать файл *.ini в кодировке UTF-16LE?

iglezz
21-10-2020, 17:51
Есть ли способ создать файл *.ini в кодировке UTF-16LE? »
Создать пустышку.
UTF-16LE BOM:FileOpen $0 ИМЯ_INI_ФАЙЛА w
FileWriteWord $0 65279

; Если сейчаc закрыть файл, то первая строка файла после первого же WriteINIStr получится пустой.
; Поэтому её можно использовать для комментария:
FileWriteUTF16LE $0 ";комментарий для инишника "

FileClose $0
UTF-16LE без BOM:
FileOpen $0 ИМЯ_INI_ФАЙЛА w
FileWriteUTF16LE $0 " " ; Записать два пробела
FileClose $0

Дальше писать обычным WriteINIStr.

MKN,
Ещё вариант в две строки :)
SetOutPath DIR
RMDir /r DIR

MKN
18-11-2020, 16:20
обновленный ProcessFunc.nsh для версий NSIS 3.XX »
А разве не эта версия входит в состав справочника NSIS_Help-1.5.chm ? (раздел "Работа с процессами с помощью NSIS")

heloy2010
29-11-2020, 06:52
К сожалению, из ссылки справочника NSIS_Help-1.5.chm, до сих пор загружается устаревшая версия ProcessFunc.nsh для NSIS 2.XX размером в 13.7 КБ.
Обновленная последняя версия ProcessFunc.nsh для NSIS 3.XX, имеет размер 12.8 КБ и здесь на сайте находится на нее ссылка на яндекс-диск. Сразу я ее не нашел, поэтому и обратился к автору ProcessFunc.nsh.

MKN
10-12-2020, 17:22
Отыскал полезный док файлик с примерами от kotkovets , как использовать ProcessFunc.nsh

murlocks
26-12-2020, 18:09
Подскажите пожалуйста примеры по использованию SendMessage с ключем WM_GETTEXT.
Примером с WM_SETTEXT очень много, а с этим ни одного не нашел

iglezz
26-12-2020, 19:48
murlocks,
Для WM_GETTEXT и других сообщений, которые возвращают значения в wParam/lParam, встроенная инструкция SendMessage не подходит.
Но можно воспользоваться плагином System.

GetDlgItem $0 $HWNDPARENT 1
System::Call 'USER32::SendMessage(i $0, i ${WM_GETTEXT}, i ${NSIS_MAX_STRLEN}, t .r1) i .r2'
MessageBox MB_OK 'text: $1$\nchars: $2'

Что здесь происходит (упрощённо):

Функция SendMessage (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessage) принимает 4 параметра:
HWND - дескриптор окна, которому отсылается сообщение
Msg - код сообщения
wParam - значение, специфичное для конкретного сообщения
lParam - значение, специфичное для конкретного сообщения

Параметры для сообщения WM_GETTEXT (https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-gettext):
wParam - максимальное число символов, которые надо прочитать, включая концевой нулевой (null, \0) символ (для чтения максимум 5 символов необходимо задать значение 6).
В примере выше ${NSIS_MAX_STRLEN} задаёт максимально возможное значение в используемой сборке NSIS (по умолчанию - 1024 символа)
lParam - указатель на буфер, содержащий прочитанный текст.
В примере выше это "t .r1", что (упрощённо) говорит "текстовое значение поместить в переменную (регистр) $1".

Функция SendMessage с сообщением WM_GETTEXT возвращает число прочитанных символов, не включая концевой символ. Это фрагмент " i .r2" в примере выше и его можно удалить, если использование этого числа не планируется.

Результат, помимо переменных $0..$9, $R0..$R9, можно поместить и в стек, $INSTDIR, $OUTDIR и некоторые другие переменные. Подробности есть в справке по плагину System.

MKN
06-01-2021, 12:21
Задача: узнать какие разрешения(права доступа), кто владелец конкретного ключа реестра ?
Первым делом попробовал имеющийся известный инструментарий - AccessControl plug-in с заявленным :
Gets the owner of an object.
GetRegKeyOwner <rootkey> <regkey>
Pop $Owner ; or "error" + error details

т.е. , как пример :
!addplugindir .
OutFile AccessControlTest.exe
RequestExecutionLevel admin
var Owner

Section
AccessControl::GetRegKeyOwner "HKLM" "SYSTEM\ControlSet001\Control\AGP"
Pop $Owner
MessageBox MB_OK "$Owner"
SectionEnd
В итоге - error.
Или я что то не так делаю, или плагин...
Также интересно, как можно использовать для этих целей RegGetKeySecurity фунукцию ?
У кого какие соображения ?

iglezz
06-01-2021, 13:45
MKN, Формат вызова неверныйGetRegKeyOwner <rootkey> <regkey>

<rootkey>
The well-known root of a registry key. Following values are defined:

HKCR - HKEY_CLASSES_ROOT
HKLM - HKEY_LOCAL_MACHINE
HKCU - HKEY_CURRENT_USER
HKU - HKEY_USERS

<regkey>
The name of the registry to alter (ie. "Software\Microsoft\Windows").

Следовательно:
AccessControl::GetRegKeyOwner "HKLM" "SYSTEM\ControlSet001\Control\AGP"

Но возвращает оно что-то не то...




© OSzone.net 2001-2012