Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, »
Только если задан флаг:
Программа установки / Ждать и устанавливать код возврата
Если включён этот параметр, SFX ждёт завершения работы каждой программы установки, указанной для запуска после извлечения данных, и устанавливает код возврата исполняемого SFX-файла равным коду возврата программы установки. Если из-за какой-либо ошибки SFX не может запустить программу установки, то он возвращает свои собственные коды ошибки, такие же, как коды возврата WinRAR. Коды возврата можно изменить на указанную величину, введя её в поле "Коррекция кода возврата"
Встречайте NSIS v3.04 (релиз от 15 декабря 2018): страница загрузки (https://sourceforge.net/projects/nsis/files/NSIS%203/3.04/)
F.1 3.04
F.1.1 Changelog
F.1.1.1 Major Changes
Added IsNativeMachineArchitecture helper macros to x64.nsh
Added experimental WinVer "Windows as a Service" detection macros
Added MakeNSISW window info "spy" tool
F.1.1.2 Minor Changes
Added MUI_TEXTCOLOR setting
nsDialogs::OnNotify can now return values back to Windows
Added LIBRARY_INSTALL_EQUAL_VERSION InstallLib option
Added NTMARTA to preload list to fix rare Windows 7 security issue (bug #1204)
AddBrandingImage now supports dialog units
Fixed !macroundef of last defined macro bug
Fixed MultiUser caption string bug (bug #1012)
!undef issues warnings instead of errors
MakeNSIS prints -CMDHELP to stdout (bug #1203)
Removed LibraryLocal utility
F.1.1.3 Translations
Added Hindī (patch #289)
Updated Belarusian, German (bug #1023), Mongolian and Spanish (bug #1205)
Привет, друзья!
Насчёт проверки запуска из архива - пример от Flix'a работает чётко.
Спасибо!
--------------------
Появилась ещё одна, а точнее две задачки по NSIS:
Можно ли определить тип видеокарты пользователя? (ATI или Nvidia).
И в зависимости от типа видюхи устанавливать файлы.
Также мне нужно определить, установлена ли у юзера Windows10.
В справке посмотрел, есть раздел "Определение ОС с помощью NSIS", но там только до Windows 8.
Я использую NSIS 3 c параметром Unicode true, правда не последнюю версию, а 3.0b2.
Можно ли определить тип видеокарты пользователя? »
самое простое, так :
;WMI.nsh - https://nsis.sourceforge.io/WMI_header
OutFile "GetVideoController.exe"
!include WMI.nsh
Section
${WMIGetInfo} root\CIMV2 Win32_VideoController AdapterCompatibility callback_Function
SectionEnd
Function callback_Function
System::Call "user32::OemToChar(t R2, t. r2)" ; нужно, если вдруг символы будут "кракозябрами"
MessageBox MB_OK "$2"
FunctionEnd
MKN, благодарю!
Пример показал инфу, что у меня видеокарта от AMD (правильно).
Кстати, в папке скрипта зачем-то создался пустой bat-файл "TempWmicBatchFile.bat"
-
Подскажите, пожалуйста, по какому параметру работать дальше?
Т.е если драйверы от AMD, то чтобы устанавливались определённые файлы.
-
Работать с текстовой строкой "Advanced Micro Devices, Inc." ?
Типа, если $2 = Advanced Micro Devices, Inc., то устанавливаем файлы.
Или как-то иначе?
Вопрос выше актуален. Друзья-коллеги, помогите разобраться.
Serg866,
Так всё очевидно... Сам же уже и ответил :
если $2 = Advanced Micro Devices, Inc., то устанавливаем файлы. »
Если в переменной "то", то делаем "это". Простая логика.
динозавра
14-02-2019, 17:57
Всем привет. Как сделать чтобы окно сообщений запускалось на другом языке, если язык виндовс не русский?
К примеру имеем вот такое сообщение
!define NAME "0"
VIProductVersion "0.0.0.0"
VIAddVersionKey "0" "0"
VIAddVersionKey "FileVersion" "${PRODUCT_VERSION}"
VIAddVersionKey "FileDescription" "0"
Var RunParamVar
Name "${NAME}"
OutFile "0.exe"
Icon "0\0.ico"
SilentInstall silent
!include "x64.nsh"
!include "FileFunc.nsh"
Section main
MessageBox MB_YESNO|MB_TOPMOST|MB_USERICON "Мама, вы жареной рыбы хотите ?" IDYES go
Abort
go:
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "Тогда нажарьте и не морочьте мне голову!"
SectionEnd
Function CheckRunParam
${GetParameters} $RunParamVar
ClearErrors
${GetOptions} $RunParamVar "" $1
${IfNot} ${Errors}
Quit
${EndIf}
FunctionEnd
Как сделать, чтобы, если виндовс не русская сообщение всплывало на другом языке, к примеру немецком? Фразы я, естественно заменю.
Или как соединить два сообщения с разными языками?
динозавра,
посмотри здесь :
https://nsis-dev.github.io/NSIS-Forums/html/t-278793.html
динозавра
15-02-2019, 12:42
За ссылку спасибо, но ничего не понял, как это можно прикрутить к моему конкретному окошку? Как я понял там обсуждается, как с какого то установщика должно всплывать окошко на нужном языке, в зависимости от регионального языка системы. А я совсем другое спрашивал.
динозавра,
тогда так :
OutFile "Select LANG_ID.exe"
!include "LogicLib.nsh"
Function .onInit
System::Call 'kernel32::GetSystemDefaultLangID() i .r0'
IntOp $0 $0 & 0xFFFF
IntFmt $0 "%04X" $0
MessageBox MB_OK "$0"
FunctionEnd
Section
${If} $0 != 0419
MessageBox MB_OK "Nachricht auf Deutsch"
${EndIf}
${If} $0 = 0419
MessageBox MB_OK "Сообщение на русском"
${EndIf}
SectionEnd
динозавра
15-02-2019, 15:12
Огромное спасибо за помощь.
Но у меня это не работает, вернее криво и при смене регионального языка ничего не меняется.
Пробовал в коде менять MessageBox MB_OK "$0" на MessageBox MB_YESNO "$0" еще хуже,
а с двумя этими строками вдвойне хуже.
Вот можно посмотреть https://streamable.com/lxmyx
динозавра,
Так ты не меняешь язык системы, потому и ID остаётся тот же. Вроде как задача была для не русской Windows ? На ней и будет работать...
А при смене языка, как делаешь ты, вероятно надо использовать - GetUserDefaultUILanguage, которая возвращает language identifier, выбранный пользователем.
Т.е. System::Call `kernel32::GetUserDefaultUILanguage() i.r0`
И вроде как, именно эту функцию использует и сам NSIS, потому и следовало бы обратить внимание на первую ссылку, что я давал...
динозавра
15-02-2019, 15:51
Я не правильно поставил вопрос. Но с видео видно, что я хотел и что этот код не работает.
А по ссылке я вообще ничего не понял. Но , все равно большое спасибо.
Kopejkin
20-02-2019, 14:30
Приветствую.
Понадобилось мне удалять из реестра ключи, сгенерированные случайным образом в различных корневых ветках, но всегда содержащие несколько одинаковых имен параметров. Пытался приспособить для этого пример из статьи Справочника по NSIS "Registry: Работа с реестром".
!include "MUI2.nsh"
!include "Registry.nsh"
!include "logicLib.nsh"
Caption registry
Name registry
OutFile registry.exe
ShowInstDetails show
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Section
${registry::Open} "HKEY_CURRENT_USER\Software\" "/N='efUeeuskh'" $0
StrCmp $0 0 0 loop
MessageBox MB_OK "Error" IDOK close
loop:
${registry::Find} "$0" $1 $2 $3 $4
StrCmp $4 "" close
DetailPrint "Ключ: $1"
DetailPrint "Имя параметра: $2"
DetailPrint "Значение параметра: $3"
DetailPrint "Тип ключа: $4"
DetailPrint "--------"
StrCpy $9 $1
; MessageBox MB_OK "$9" IDOK
${registry::DeleteKey} "HKCU\$9" $R0
; MessageBox MB_OK "HKCU\$9" IDOK
Goto loop
close:
${registry::Close} "$0"
${registry::Unload}
SectionEnd
В общем - работает, кажется. Но тогда получается, нужно такой код писать для каждой корневой ветки реестра? А я и так в переменных чуть не запутался. :lamer:
Может как-то умнее можно это оформить?
тогда получается, нужно такой код писать для каждой корневой ветки реестра? »
Для каждой. Но меньше писанины будет, если использовать RegistryFunc.nsh от kotkovets
${RegFind} "Key" "Options" Function
Попробуй, может подойдёт для твоего случая...
AlekseyPopovv
09-03-2019, 12:33
После установки приложения запускаю файл "start.cmd" командой Exec "$EXEDIR\${APP}\start.cmd"
Файл запускается как и надо не скрыто, но почему то
:info
echo.
if exist "%programfiles%/Notepad++/notepad++.exe" goto note64i
if exist "%programfiles(x86)%/Notepad++/notepad++.exe" goto note86i
notepad bin/info.txt
pause
goto home
:note64i
"%programfiles%/Notepad++/notepad++.exe" bin/info.txt
pause
goto home
:note86i
"%programfiles(x86)%/Notepad++/notepad++.exe" bin/info.txt
pause
goto home
в файле "start.cmd" не срабатывают. Т.е. Notepad++ не запускается, а сразу стандартный блокнот.
Если закрыть файл "start.cmd" и заново запустить, то всё работает как надо. В чём причина может быть?
Уважаемые, есть живые? :) После большого перерыва все забыл.....ну почти все... Подскажите, пожалуйста, как отловить нажатие клавиши на клаве (Ctrl) после закрытия MessageBox кнопкой "Отмена"? То есть нажимаю Ctrl, удерживаю и одновременно нажимаю Отмену в сообщении. Хочу "раздвоить" отмену...
как отловить нажатие клавиши на клаве (Ctrl) »
Можно с помощью функции GetAsyncKeyState
Пример отслеживания нажатия Shift http://nsis-dev.github.io/NSIS-Forums/html/t-237087.html
Тебе нужен VK_CONTROL 0x11
MKN, отлично, все получилось! Спасибо за отзывчивость :yes:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC