|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
|
.: NSIS - все вопросы :. часть 2.
|
|
Ветеран Сообщения: 1216 |
![]() Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения. Описание: Текущая версия: NSIS 3.05 от 15 декабря 2019 года Скачать | Архив сборок версии Первая часть этой темы Скачать первую часть этой темы одним архивом ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов: Справочник по NSIS - создан силами нашего сообщества. Руководство пользователя. Перевод – Поляков А.В, зеркало Документация Утилиты разработчика Расширение функциональности Примеры скриптов на нашем форуме Скрипт NSIS для перепаковки AIMP2+Сборки Тема для Notepad++(пример парсинга XML) Достоинства Ещё немного полезной информации: |
|
|
------- Отправлено: 12:02, 09-12-2012 |
|
Старожил Сообщения: 169
|
Профиль | Отправить PM | Цитировать Нужно что то подобное, без MUI. Есть варианты?
|
|
Отправлено: 11:35, 10-08-2023 | #2771 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать AlekseyPopovv,
Разница между с MUI и без MUI в том, что с MUI пишется без MUI пишется Дальше всё одинаково. Кроме того локалицацию проще и правильнее прописывать так: ; Подключение языковый файлов
; English должен быть первый, т.к. если в списке подключённых языков отсутствует язык системы, то грузится первый по списку
LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
; Объявление многоязычной строки:
LangString AlreadyRunningMessage ${LANG_ENGLISH} "The "${APP}" is already running!"
LangString AlreadyRunningMessage ${LANG_RUSSIAN} "Программа "${APP}" уже запущена!"
...
; Использование многоязычной строки:
MessageBox MB_USERICON|MB_OK $(AlreadyRunningMessage)
Abort
Пример
!include SingleInstance.nsh
RequestExecutionLevel user
Page instfiles
UninstPage uninstConfirm
Section
DetailPrint A
Sleep 1000
DetailPrint B
Sleep 1000
DetailPrint C
Sleep 1000
DetailPrint D
Sleep 1000
SectionEnd
Section un.
SectionEnd
Function .onInit
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
WriteUninstaller $EXEDIR\un1.exe
FunctionEnd
Function un.onInit
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
FunctionEnd
SingleInstance.nsh
/*
Based on `Allow only one installer instance` example (https://nsis.sourceforge.io/Allow_only_one_installer_instance)
Usage example:
; Define unique mutex name (optional)
!define INSTALLERMUTEXNAME "myVeryUniqueInstallerMutexName"
!define UNINSTALLERMUTEXNAME "myVeryUniqueUninstallerMutexName"
${IfThen} ${AlreadyRunning} ${|} ${ActivateAlreadyRunningAndAbort} ${|}
${If} ${AlreadyRunning}
.. instructions before activate ..
${ActivateAlreadyRunning}
.. instructions after activate ..
Abort
${EndIf}
*/
!ifndef SingleInstance.nsh
!define SingleInstance.nsh
!include LogicLib.nsh
!include WinMessages.nsh
!include Win\WinError.nsh
!include Win\WinUser.nsh
!define AlreadyRunning `"" AlreadyRunning ""`
!macro _AlreadyRunning _a _b _t _f
!insertmacro _LOGICLIB_TEMP
!ifdef __UNINSTALL__
!define /ifndef UNINSTALLERMUTEXNAME '$(^Name)$(^UninstallCaption) Mutex'
!define /redef CHECKALREADYEXISTINGMUTEXNAME '${UNINSTALLERMUTEXNAME}'
!else
!define /ifndef INSTALLERMUTEXNAME '$(^Name)$(^SetupCaption) Mutex'
!define /redef CHECKALREADYEXISTINGMUTEXNAME '${INSTALLERMUTEXNAME}'
!endif
System::Call 'kernel32::CreateMutex(p 0, i 1, t "${CHECKALREADYEXISTINGMUTEXNAME}") ?e'
Pop $_LOGICLIB_TEMP
IntCmpU $_LOGICLIB_TEMP ${ERROR_ALREADY_EXISTS} `${_t}` `${_f}` `${_f}`
!macroend
!define ActivateAlreadyRunning `!insertmacro ActivateAlreadyRunning`
!macro ActivateAlreadyRunning
Push $0 ; Window handle
Push $1 ; Caption we are looking for
Push $2 ; Caption length
Push $3 ; GetWindowText output
StrCpy $0 '' ; Start FindWindow with NULL
!ifdef __UNINSTALL__
StrCpy $1 '$(^UninstallCaption)'
!else
StrCpy $1 '$(^SetupCaption)'
!endif
StrLen $2 $1
IntOp $2 $2 + 1 ; GetWindowText count includes \0
; loop:
FindWindow $0 '#32770' '' '' $0
StrCmp $0 0 +5 ; windownotfound: next
System::Call 'user32::GetWindowText(p r0, t.r3, i r2)'
StrCmp $3 $1 0 -3 ; windowfound: loop:
; windowfound:
SendMessage $0 ${WM_SYSCOMMAND} ${SC_RESTORE} 0 /TIMEOUT=2000 ; Restore the window if it is minimized
System::Call 'user32::SetForegroundWindow(p r0)'
; windownotfound:
Pop $3
Pop $2
Pop $1
Pop $0
!macroend
!define ActivateAlreadyRunningAndAbort `!insertmacro ActivateAlreadyRunningAndAbort`
!macro ActivateAlreadyRunningAndAbort
${ActivateAlreadyRunning}
Abort
!macroend
!endif
|
|
Отправлено: 14:12, 10-08-2023 | #2772 |
|
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать Ещё вопрос:
Можно ли "правильней" или "красивей" или по другому написать следующий код: |
|
Отправлено: 19:07, 10-08-2023 | #2773 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать inco1,
1. От метки с Goto надо избавляться, раз присутствует конструкция If/Else: SetRegView 64
ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\test" 0
${If} ${Errors}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка"
${Else}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
Quit
${EndIf}
SetRegView 32
SetRegView 64
${If} HKLM RegKeyExists "SOFTWARE\test"
; Существует
${Else}
; Ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка
${EndIf}
SetRegView 32
!ifndef RegKeyExists
!macro _RegKeyExists _a _b _t _f
!insertmacro _LOGICLIB_TEMP
ClearErrors
EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` 0
IfErrors `${_f}` `${_t}`
!macroend
!define RegKeyExists `RegKeyExists`
!endif
Отсутствие ошибки EnumRegKey или положительный тест RegKeyExists значит, что ключ существует. Ошибка после EnumRegKey или отрицательный тест RegKeyExists значит, что ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка |
|
Последний раз редактировалось iglezz, 10-08-2023 в 22:26. Причина: замена на корректный вариант Отправлено: 19:40, 10-08-2023 | #2774 |
|
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz,
Для теста создал простой экзешник: OutFile "Test.exe"
SilentInstall silent
!include "LogicLib.nsh"
Section
SetRegView 64
${If} HKLM RegKeyIsEmpty "SOFTWARE\test"
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
Quit
${Else}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
${EndIf}
SetRegView default
SectionEnd
А мой вариант пишет правильно, что "Нету нужной записи в реестре". OutFile "Test1.exe"
SilentInstall silent
!include "LogicLib.nsh"
Section
SetRegView 64
ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\test" 0
${If} ${Errors}
Goto none
${Else}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
Quit
${EndIf}
none:
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
SetRegView 32
SectionEnd
|
|
Отправлено: 20:50, 10-08-2023 | #2775 |
|
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz,
OutFile "Test.exe"
SilentInstall silent
!include "LogicLib.nsh"
Section
SetRegView 64
${If} HKLM RegKeyIsEmpty "SOFTWARE\test"
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
Quit
${Else}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
${EndIf}
SetRegView default
SectionEnd
|
|
Отправлено: 21:24, 10-08-2023 | #2776 |
|
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz,
В том то и дело,что я всегда проверяю с реальным реестром в двух реальных вариантах - на наличие записи, которую сам добавляю и на отсутствие,которую удаляю. Реально работает только мой вот этот вариант, который я просил усовершенствовать: OutFile "Test1.exe"
SilentInstall silent
!include "LogicLib.nsh"
Section
SetRegView 64
ClearErrors
EnumRegKey $0 HKLM "SOFTWARE\test" 0
${If} ${Errors}
Goto none
${Else}
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Есть нужная запись в реестре"
Quit
${EndIf}
none:
MessageBox MB_OK|MB_TOPMOST|MB_ICONSTOP "Нету нужной записи в реестре"
SetRegView 32
SectionEnd
|
|
Отправлено: 22:15, 10-08-2023 | #2777 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать inco1,
Обновил своё первое сообщение и поудалял некорректные/ненужные Пример компилируется и работает корректно. Если вдруг будут ошибки компилятора, то нужно читать, что именно не так. |
|
Отправлено: 22:27, 10-08-2023 | #2778 |
|
Пользователь Сообщения: 93
|
Профиль | Отправить PM | Цитировать iglezz,
Огромнейшее спасибо за помощь. В процессе проб и тестов присмотрелся к своему первоначальному коду и упростил его. Получился простой код и работает, как и раньше корректно. Вот, что получилось: |
|
Отправлено: 23:14, 10-08-2023 | #2779 |
|
Старожил Сообщения: 352
|
Профиль | Отправить PM | Цитировать С помощью функций Win API возможна более корректная проверка ключей на не_существует/нет_доступа/другие_ошибки
пример
ShowInstDetails show
InstallColors /windows
SetFont "Consolas" 10
AutoCloseWindow false
SetOverwrite on
RequestExecutionLevel user
!include LogicLib.nsh
!include RegistryFunc.nsh
!include SystemFunc.nsh
Section
${GetRegKeyStatus} $R0 HKLM 'Software\Microsoft' ; exist
${GetSystemErrorMessage} $R1 $R0
DetailPrint "Soft\MS: $R0: $R1"
${GetRegKeyStatus} $R0 HKLM 'qwertyuiop' ; not exist
${GetSystemErrorMessage} $R1 $R0
DetailPrint "qwertyu: $R0: $R1"
${GetRegKeyStatus} $R0 HKLM 'SAM\SAM' ; access denied
${GetSystemErrorMessage} $R1 $R0
DetailPrint "SAM\SAM: $R0: $R1"
SectionEnd
Section
${If} HKLM RegKeyExists 'Software\Microsoft'
DetailPrint "Soft\MS: exists"
${EndIf}
${If} HKLM RegKeyExists 'qwertyuiop'
DetailPrint "qwertyu: exists"
${EndIf}
${If} HKLM RegKeyExists 'SAM\SAM'
DetailPrint "SAM\SAM: exists"
${EndIf}
${If} HKLM RegKeyNotExists 'Software\Microsoft'
DetailPrint "Soft\MS: not exists"
${EndIf}
${If} HKLM RegKeyNotExists 'qwertyuiop'
DetailPrint "qwertyu: not exists"
${EndIf}
${If} HKLM RegKeyNotExists 'SAM\SAM'
DetailPrint "SAM\SAM: not exists"
${EndIf}
${If} HKLM RegKeyAccessDenied 'Software\Microsoft'
DetailPrint "Soft\MS: access denied"
${EndIf}
${If} HKLM RegKeyAccessDenied 'qwertyuiop'
DetailPrint "qwertyu: access denied"
${EndIf}
${If} HKLM RegKeyAccessDenied 'SAM\SAM'
DetailPrint "SAM\SAM: access denied"
${EndIf}
SectionEnd
RegistryFunc.nsh
!ifndef RegistryFunc.nsh
!define RegistryFunc.nsh
!include LogicLib.nsh
!include WinCore.nsh
!define KEY_QUERY_VALUE 0x0001
!define KEY_ENUMERATE_SUB_KEYS 0x0008
!macro Push_root_key root_key
!if ${root_key} == HKEY_CLASSES_ROOT
Push ${HKEY_CLASSES_ROOT}
!else if ${root_key} == HKCR
Push ${HKEY_CLASSES_ROOT}
!else if ${root_key} == HKEY_CURRENT_USER
Push ${HKEY_CURRENT_USER}
!else if ${root_key} == HKCU
Push ${HKEY_CURRENT_USER}
!else if ${root_key} == HKEY_LOCAL_MACHINE
Push ${HKEY_LOCAL_MACHINE}
!else if ${root_key} == HKLM
Push ${HKEY_LOCAL_MACHINE}
!else if ${root_key} == HKEY_USERS
Push ${HKEY_USERS}
!else if ${root_key} == HKU
Push ${HKEY_USERS}
!else if ${root_key} == HKEY_PERFORMANCE_DATA
Push ${HKEY_PERFORMANCE_DATA}
!else if ${root_key} == HKEY_CURRENT_CONFIG
Push ${HKEY_CURRENT_CONFIG}
!else if ${root_key} == HKCC
Push ${HKEY_CURRENT_CONFIG}
!else if ${root_key} == HKEY_DYN_DATA
Push ${HKEY_DYN_DATA}
!else
Push '${root_key}'
!endif
!macroend
!define GetRegKeyStatus `!insertmacro GetRegKeyStatus `
!macro GetRegKeyStatus result root_key sub_key
Push $0
Push '${sub_key}'
!insertmacro Push_root_key ${root_key}
System::Call "Advapi32::RegOpenKeyEx(is, ts, i0, i${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, *p.r0) i.s"
StrCmp $0 0 +2
System::Call "Advapi32::RegCloseKey(i r0) i"
Exch
Pop $0
Pop ${result}
!macroend
!define RegKeyExists `RegKeyExists`
!macro _RegKeyExists _a _b _t _f
!insertmacro _LOGICLIB_TEMP
ClearErrors
EnumRegKey $_LOGICLIB_TEMP ${_a} `${_b}` 1
IfErrors `${_f}` `${_t}`
!macroend
!define RegKeyNotExists `RegKeyNotExists`
!macro _RegKeyNotExists _a _b _t _f
!insertmacro _LOGICLIB_TEMP
${GetRegKeyStatus} $_LOGICLIB_TEMP ${_a} '${_b}'
StrCmp $_LOGICLIB_TEMP 2 `${_t}` `${_f}`
!macroend
!define RegKeyAccessDenied `RegKeyAccessDenied`
!macro _RegKeyAccessDenied _a _b _t _f
!insertmacro _LOGICLIB_TEMP
${GetRegKeyStatus} $_LOGICLIB_TEMP ${_a} '${_b}'
StrCmp $_LOGICLIB_TEMP 5 `${_t}` `${_f}`
!macroend
!endif
SystemFunc.nsh
!ifndef SystemFunc.nsh
!define SystemFunc.nsh
!define GetSystemErrorMessage `!insertmacro GetSystemErrorMessage `
!macro GetSystemErrorMessage result error_code
System::Call 'kernel32::GetSystemDefaultUILanguage()i.s'
Push ${error_code}
System::Call "kernel32::FormatMessage(i0x1300, in, is, is, *t.s, i${NSIS_MAX_STRLEN}, in)i"
Pop ${result}
!macroend
!endif
|
|
Отправлено: 01:02, 11-08-2023 | #2780 |
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 2 | dimadr | Наборы обновлений для Windows XP/2003/Windows 7 | 267 | 14-02-2020 08:25 | |
| [архив].: NSIS - все вопросы :. | kotkovets | Автоматическая установка приложений | 3387 | 09-12-2012 11:56 | |
| Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 1 | jameszero | Наборы обновлений для Windows XP/2003/Windows 7 | 1491 | 22-07-2011 22:42 | |
| Выбор|модернизация процессора .:[все вопросы]:. Часть I | Myxa | Выбор отдельных компонентов компьютера и конфигурации в целом | 1845 | 01-01-2011 19:18 | |
| Вопросы по создателю инсталляций NSIS | MaxDELETE | Программное обеспечение Windows | 14 | 04-07-2007 10:01 | |
|