|
Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2. |
|
.: NSIS - все вопросы :. часть 2.
|
Ветеран Сообщения: 1216 |
Профиль | Отправить PM | Цитировать
Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором 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 |
|