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

inco1
02-06-2020, 12:42
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно?

iglezz
02-06-2020, 12:45
inco1,
ExecShellWait

Begin2Fly
02-06-2020, 12:48
Всем доброго времени суток.
В установщике с помощью ExecShell "open" "$INSTDIR\readme.txt" запускается текстовый документ. Но также продолжают срабатывать все последующие команды.
Как нужно сделать, чтобы после запуска этого документа следующие команды в установщике не запускались до тех пор, пока пользователь сам не закроет этот документ. Или это сделать не возможно? »
ExecWait '"$WINDIR\Notepad.exe" "$INSTDIR\readme.txt"'
Либо, как ответил iglezz, ExecShellWait, тогда запустится ассоциированная с txt программа.

inco1
02-06-2020, 12:53
iglezz, Спасибо. Это именно то, что мне нужно. Потратил час на поиск в справке и не нашел, а вы мне за 3 минутки.
Begin2Fly, Благодарю. Экспериментну с обеими вариантами.

inco1
04-06-2020, 11:30
Всем доброго времени суток.
Помогите, пожалуйста вот в каком деле.
Стоит задача. Если язык в системе русский и на диске 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)
Помогите, пожалуйста поправить мой код, чтобы антивирусники замолчали. Видать они что то видят неправильное в коде.

iglezz
04-06-2020, 11:42
inco1,
Эта задача решается сугубо административными методами - обвешивание сертификатами, контакт с разрабами "антивирусов" на тему внесения своего безвредного творения в белые списки и т.п.

inco1
04-06-2020, 11:48
iglezz, С антивирусниками ясно, но думается мне, что не разрешимо. Код сгодиться? Ничего править не нужно?

iglezz
04-06-2020, 12:19
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

inco1
04-06-2020, 12:49
iglezz, Спасибо.

inco1
04-06-2020, 14:35
Если я вас еще не утомил, то, пожалуйста помогите еще с одним вопросом.
Как бы мне этак прописать. чтобы в самом начале запуска установщика была проверка учетной записи, и если учетка "пользователь" или "гость", даже, если запуск с правами администратора, то показывалось бы сообщение, что Вы, мил человек имеете совсем мало прав" и установка закончилась не начинаясь?.

MKN
04-06-2020, 18:03
чтобы в самом начале запуска установщика была проверка учетной записи »
Так это стандартные возможности "боксового" 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

Можно конечно и по всякому...

inco1
04-06-2020, 19:55
MKN, Это то, что нужно. Попробую прикрутить к моему установщику. Спасибо. Этого в справке не видел.

PS. Всё красиво прикрутил, как в поставленной задаче и всё работает.
Не ясен один момент, кто такой Power?

MKN
05-06-2020, 10:11
кто такой 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

inco1
06-06-2020, 14:08
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать?

Begin2Fly
06-06-2020, 14:28
Всем доброго времени суток.
Я в тупике. Существует ли способ, чтобы не дожидаясь завершения команды "newadvsplash::show 5000 100 100" сделать переход к следующей команде?
Вариант с отдельным экзешником, как то не по взрослому. Может старожилы чего смогут подсказать? »
newadvsplash::show 5000 100 100 /BANNER

inco1
06-06-2020, 14:33
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается.

Begin2Fly
06-06-2020, 14:39
Begin2Fly, Я это пробовал в первую очередь. Пока эта команда не отработает следующая не начинается. »
https://streamable.com/wj35df
Если дадите более полный код, попробую с вашим.

inco1
06-06-2020, 15:31
Да, у вас это работает. Видимо много чего имеет значение. Нужно некоторое время, чтобы собрать все до кучи. Пришлю в личку.

K.A.V.
07-06-2020, 17:57
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

inco1
08-06-2020, 19:54
K.A.V., Спасибо. Begin2Fly предложил простой вариант:

newadvsplash::show /NOUNLOAD 5000 100 100 -2 /BANNER
; После отработки всех последующих команд добавить это:
newadvsplash::stop

Можно пример добавить в справку.




© OSzone.net 2001-2012