Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно?
Begin2Fly
02-06-2020, 12:48
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно? »
ExecWait '"$WINDIR\Notepad.exe" "$INSTDIR\readme.txt"'
Либо, как ответил iglezz, ExecShellWait, тогда запустится ассоциированная с txt программа.
iglezz, Спасибо. Это именно то, что мне нужно. Потратил час на поиск в справке и не нашел, а вы мне за 3 минутки.
Begin2Fly, Благодарю. Экспериментну с обеими вариантами.
Всем доброго времени суток.
Помогите, пожалуйста вот в каком деле.
Стоит задача. Если язык в системе русский и на диске D в папке test имеется изображение test.gif , то оно должно показаться на две секунды. С другим языком это изображение не должно показываться. Сделал такой код:
OutFile "Test.exe"
SilentInstall silent
SetCompressor /SOLID lzma
!include "LogicLib.nsh"
Function .onInit
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
FunctionEnd
Section
${If} $0 = 0419
newadvsplash::show 2000 100 100 "D:\test\test.gif"
Abort
${EndIf}
SectionEnd
Задача выполнена. Код компилируется. Экзешник создается и работает согласно поставленной задаче. Ничего криминального.
Но почему тогда 9 антивирусников пишут всякую всячину по поводу этого файла?
virustotal (https://www.virustotal.com/gui/file/4cc6e1c3dcb8053d34942bd0a37026f9587f3ec4c9ee6be9b9a8a4ffa14d9a5f/detection)
Помогите, пожалуйста поправить мой код, чтобы антивирусники замолчали. Видать они что то видят неправильное в коде.
inco1,
Эта задача решается сугубо административными методами - обвешивание сертификатами, контакт с разрабами "антивирусов" на тему внесения своего безвредного творения в белые списки и т.п.
iglezz, С антивирусниками ясно, но думается мне, что не разрешимо. Код сгодиться? Ничего править не нужно?
inco1,
Не стоит переносить данные в переменных общего значение ($0..$9, $R0..$R9) между разными блоками кода, они могут потеряться при использовании колбек-функций .onMouseOverSection, .onSelChange или плохо оформленного куска кода, который не заботится о сохранении состояния $0..$9, $R0..$R9.
Код получения системного языка по умолчанию лучше поместить в отдельную функцию/макрос (или даже вынести в свой отдельный .nsh):
Function GetDefaultLanguageFunc
Push $0 ; отправим $0 в стек, чтобы сохранить её состояние до вызова функции
System::Call "kernel32::GetUserDefaultLCID() i.r0"
IntOp $LANGUAGE $0 & 0xFFFF
IntFmt $0 "%04X" $0
Exch $0 ; сохранённое значение $0 из стека возвращается на место, полученный код языка помещается в стек
FunctionEnd
Section
Call GetDefaultLanguageFunc ; вызываем функцию
Pop $0 ; извлекаем из стека полученный функцией код языка
${If} $0 = 0419
newadvsplash::show 2000 100 100 "D:\test\test.gif"
Abort
${EndIf}
SectionEnd
Если я вас еще не утомил, то, пожалуйста помогите еще с одним вопросом.
Как бы мне этак прописать. чтобы в самом начале запуска установщика была проверка учетной записи, и если учетка "пользователь" или "гость", даже, если запуск с правами администратора, то показывалось бы сообщение, что Вы, мил человек имеете совсем мало прав" и установка закончилась не начинаясь?.
чтобы в самом начале запуска установщика была проверка учетной записи »
Так это стандартные возможности "боксового" NSIS... В доке есть и пример :
Name "UserInfo.dll test"
OutFile UserInfo.exe
RequestExecutionLevel Highest
!define REALMSG "$\nOriginal non-restricted account type: $2"
Function .onInit
ClearErrors
UserInfo::GetName
IfErrors PluginFail
Pop $0
StrCmp $0 "" 0 +2
StrCpy $0 "?"
UserInfo::GetAccountType
Pop $1
UserInfo::GetOriginalAccountType
Pop $2
StrCmp $1 "Admin" 0 +3
MessageBox MB_OK 'User "$0" is in the Administrators group${REALMSG}'
Goto done
StrCmp $1 "Power" 0 +3
MessageBox MB_OK 'User "$0" is in the Power Users group${REALMSG}'
Goto done
StrCmp $1 "User" 0 +3
MessageBox MB_OK 'User "$0" is just a regular user${REALMSG}'
Goto done
StrCmp $1 "Guest" 0 +3
MessageBox MB_OK 'User "$0" is a guest${REALMSG}'
Goto done
MessageBox MB_OK "Unknown error"
Goto done
PluginFail:
MessageBox MB_OK "Error! Unable to call plug-in!"
done:
FunctionEnd
Section
SectionEnd
Можно конечно и по всякому...
MKN, Это то, что нужно. Попробую прикрутить к моему установщику. Спасибо. Этого в справке не видел.
PS. Всё красиво прикрутил, как в поставленной задаче и всё работает.
Не ясен один момент, кто такой Power?
кто такой Power? »
Power Users group - Группа опытных пользователей
Приложения, требующие повышения прав при запуске в Windows 7, не могут выполнять стандартные учетные записи пользователей, в отличие, например, от загрузки и установки Firefox. Именно здесь приходит группа опытных пользователей, чтобы предоставить необходимые привилегии для этих унаследованных приложений.
Или здесь про Power Users :
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc771990(v=ws.11)?redirectedfrom=MSDN
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать?
Begin2Fly
06-06-2020, 14:28
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать? »
newadvsplash::show 5000 100 100 /BANNER
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается.
Begin2Fly
06-06-2020, 14:39
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается. »
https://streamable.com/wj35df
Если дадите более полный код, попробую с вашим.
Да, у вас это работает. Видимо много чего имеет значение. Нужно некоторое время, чтобы собрать все до кучи. Пришлю в личку.
inco1, как вариант, можно воспользоваться плагином NsThread (https://nsis.sourceforge.io/NsThread_plug-in) и создать функцию с отдельным потоком, в которой будет показываться изображение
Будет что-то типа:
Function ThreadProc
newadvsplash::show 5000 100 100 /BANNER "$DESKTOP\2222222222222222222222222222222222.jpg"
MessageBox MB_OK "Сообщение из потока"
FunctionEnd
Function .oninit
${Thread_Create} ThreadProc $R0
MessageBox MB_OK "Основной поток"
FunctionEnd
K.A.V., Спасибо. Begin2Fly предложил простой вариант:
newadvsplash::show /NOUNLOAD 5000 100 100 -2 /BANNER
; После отработки всех последующих команд добавить это:
newadvsplash::stop
Можно пример добавить в справку.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC