Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Serg866,
Ух.. Мой косяк :(
${OrIf} надо заменить на ${AndIf}
Подскажите, как узнать, на какой странице прервалась работа инсталлера, чтобы отправить событие в аналитику. OnUserAbort же не дает такой инфы? (если уместно, я бы попросил возмездной помощи в целом по установке)
Hoha,
Можно объявить переменную (https://nsis.sourceforge.io/Docs/Chapter4.html#varuser) и использовать callback-функции страниц (https://nsis.sourceforge.io/Docs/Chapter4.html#pagecallbacks_explain) для установки в эту переменную некоего значения, по которому в .OnUserAbort можно будет определить точку, на которой пользователь захотел выйти.
iglezz, Спасибо!
Есть еще проблема с накладыванием текста по требованиям свободного места на диске после каждого измнения пути установки. https://i.imgur.com/pfBk0nl.png
Сечас решили как
Function .onVerifyInstDir
LockWindow off
FunctionEnd
Hoha, непонятно что за проблема с накладыванием текста. Тут надо пару скринов/анимация проблемы или компилируемый кусок скрипта.
Напомните пожалуйста, есть ли простой способ(код в одну строку :) ), чтобы удалить файлы из каталога, НЕ УДАЛЯЯ сам каталог ? (Что то мне кажется, что такового не существует в NSIS...) В две строки - удалив каталог с файлами и создав вновь- это как то топорно...
AlekseyPopovv
20-10-2020, 13:23
MKN, Delete "$DESKTOP\*.*"
AlekseyPopovv,
Мдя... Видел же в "Справочнике", под названием - "Удаление всех файлов с рабочего стола". Даже в голову не пришло, что оно и есть... :)
Begin2Fly
20-10-2020, 13:43
MKN, но обратите внимание, что таким образом удалятся только файлы, папки останутся на месте.
AlekseyPopovv
20-10-2020, 13:43
MKN, Я сразу понял что что то не то тут... :)
Begin2Fly,
Действительно, любопытное поведение... А для удаления и папок, вроде как макрос какой то был...
AlekseyPopovv
21-10-2020, 16:27
Есть ли способ создать файл *.ini в кодировке UTF-16LE?
Есть ли способ создать файл *.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
обновленный 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.
Отыскал полезный док файлик с примерами от kotkovets , как использовать ProcessFunc.nsh
murlocks
26-12-2020, 18:09
Подскажите пожалуйста примеры по использованию SendMessage с ключем WM_GETTEXT.
Примером с WM_SETTEXT очень много, а с этим ни одного не нашел
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.
Задача: узнать какие разрешения(права доступа), кто владелец конкретного ключа реестра ?
Первым делом попробовал имеющийся известный инструментарий - 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 фунукцию ?
У кого какие соображения ?
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC