.: NSIS - все вопросы :. часть 2.

Ответить
 • Просмотры: 77
Аватара пользователя
murlocks

Re: .: NSIS - все вопросы :. часть 2.

Сообщение murlocks »

Цитата Iska:



Ну, человек открывает для себя мир программирования
.: NSIS - все вопросы :. часть 2.




Да не нужно ему ничего, кроме готовой строчки кода (краткое содержание его поэмы в ЛС)

В личных сообщениях он мне уже "доступным языком пояснил", кто я и что я должен сделать со своим "справочником" по NSIS
Аватара пользователя
murlocks

Re: .: NSIS - все вопросы :. часть 2.

Сообщение murlocks »

murlocks,

Для WM_GETTEXT и других сообщений, которые возвращают значения в wParam/lParam, встроенная инструкция SendMessage не подходит.

Но можно воспользоваться плагином System.

Пример, читающий текст с кнопки Next/Install/Close

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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
принимает 4 параметра:

HWND - дескриптор окна, которому отсылается сообщение

Msg - код сообщения

wParam - значение, специфичное для конкретного сообщения

lParam - значение, специфичное для конкретного сообщения

Параметры для сообщения
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

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Задача: узнать какие разрешения(права доступа), кто владелец конкретного ключа реестра ?

Первым делом попробовал имеющийся известный инструментарий - AccessControl plug-in с заявленным :

Цитата:

Gets the owner of an object.

GetRegKeyOwner

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

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Цитата динозавра:



как добиться уведомления для пользователя без прав, что установщик типа не для него
.: NSIS - все вопросы :. часть 2.




А разве UserInfo::GetAccountType не работает ?



Попробуй так :





Код:

Код: Выделить всё

OutFile "IsUserAdmin-test.exe"
!Include "LogicLib.nsh"
Function .onInit
System::Call setupapi::IsUserAdmin()i.r0
${If} $0 = 1
MessageBox MB_OK|MB_ICONINFORMATION "Есть права администратора"     
${Else}
MessageBox MB_OK|MB_ICONINFORMATION "Нет прав администратора. До свидания !"
Quit
${EndIf}
FunctionEnd
Section
MessageBox MB_OK "Setup"
SectionEnd
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

MKN, Оно как-то странно работает или плохо документировано.



Скрытый текст

[spoiler]Для кода

Код:
[/spoiler]

Код: Выделить всё

AccessControl::GetRegKeyGroup "HKCU" "Software\7-Zip\"
Pop $R1
DetailPrint "HKCU:R1: $R1"
Pop $R2
DetailPrint "HKCU:R2: $R2"
AccessControl::GetRegKeyGroup "HKLM" "Software\7-Zip\"
Pop $R1
DetailPrint "HKLM:R1: $R1"
Pop $R2
DetailPrint "HKLM:R2: $R2"

Выдаёт в лог:



Код:

Код: Выделить всё

HKCU:R1: Software\7-Zip\
HKCU:R2: Cannot look up owner. Error code: 87
HKLM:R1: error
HKLM:R2: Cannot get current ownership. Error code: 2







К тому же у этого плагина не очень с обработкой ошибок, судя по моему непрофессиональному взгляду в исходники.
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Цитата динозавра:



о сначала появляется окно от имени админа и по нажатию да выдает "Есть права администратора".
.: NSIS - все вопросы :. часть 2.




Потому что нужен RequestExecutionLevel user
RequestExecutionLevel highest
Аватара пользователя
MKN

Re: .: NSIS - все вопросы :. часть 2.

Сообщение MKN »

Всем привет.

У меня такой вот вопрос. Я, например, извлекаю реальное место установки программы так



Код:

Код: Выделить всё

ReadRegStr $R9 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\test.exe" "Put"

Все просто, если извлекать только из одного раздела. Это меня устраивает, но....

Можно ли как то прописать, чтобы указать дополнительное извлечения места с другого раздела.



Код:

Код: Выделить всё

ReadRegStr $R9 HKLM "SOFTWARE\test" "Put"

Параметр "Put"показывает одно и то же место , но вся закавыка, что любой из этих разделов может отсутствовать в реестре.

Нужно взять с первого раздела, а если раздел не найден, то со второго, но обязательно в одну переменную, например $R9. Если один из разделов или оба не найдены, то уведомление об этом не нужно. Как вот такое сотворить?
Аватара пользователя
iglezz

Re: .: NSIS - все вопросы :. часть 2.

Сообщение iglezz »

Цитата динозавра:



Что не так.
.: NSIS - все вопросы :. часть 2.




Где не так? Код в студию.

IsUserAdmin() возвращает 1 при наличии админских привелегий
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

iglezz, Спасибо, это то, что нужно. Все просто и работает.
Аватара пользователя
inco1

Re: .: NSIS - все вопросы :. часть 2.

Сообщение inco1 »

...подскажите как сделать так чтобы nsis отсылал запрос на iplogger!?

Хочу получать статистику о запуске моего софта.
Ответить

Вернуться в «Автоматическая установка приложений»