Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Ответить
Настройки темы
.: NSIS - все вопросы :. часть 2.

Аватара для kotkovets

Ветеран


Сообщения: 1216
Благодарности: 486


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: kotkovets
Дата: 07-06-2020
Описание: NSIS 3.05


Данная тема предназначена для обсуждения вопросов, связанных с инсталлятором Nullsoft Scriptable Install System, или просто NSIS. Сайт приложения.


Описание:
читать дальше »
NSIS (Nullsoft Scriptable Install System) - профессиональная система для создания инсталляторов в среде Windows с октрытым исходным кодом. При своем малом размере система очень гибкая, и при с широкими возможностями. Генерируемый ею инсталлятор также имеет очень маленький размер и идеально подходит для распространения продукта через Интернет.


Текущая версия: NSIS 3.05 от 15 декабря 2019 года
Скачать | Архив сборок версии

Первая часть этой темы
Скачать первую часть этой темы одним архивом

ВНИМАНИЕ! прежде, чем задать вопрос, почитайте, где Вы найдете ответы на большинство вопросов:
Справочник по NSIS - создан силами нашего сообщества.
Руководство пользователя. Перевод – Поляков А.В, зеркало

Документация

Утилиты разработчика
Расширение функциональности

Примеры скриптов на нашем форуме
Скрипт NSIS для перепаковки AIMP2+Сборки
Тема для Notepad++(пример парсинга XML)

Достоинства
читать дальше »


◦ Очень маленький размер установочного блока (около 34 Кбайт)
◦ zlib, bzip2 и LZMA-сжатие
◦ Гибкая система скриптов (спецально разработанная для инсталляторов)
◦ Поддержка многоязычности, точнее 53 языка, есть возможность ввода нового языка
◦ Поддержка плагинов
◦ Скрипт Препроцессор
◦ Создание Web-инсталляторов


Ещё немного полезной информации:
читать дальше »

▫ История создания установщика

NSIS создан как альтернатива InstallShield, предназначенного для коммерческих продуктов.

NSIS был создан для распространения Winamp. Он базируется на предыдущем продукте Nullsoft — PiMP (plugin Mini Packager), иначе известным как SuperPiMP. После версии 2.0a0, проект был перемещён на SourceForge.net, где к работе над ним присоединились и сторонние разработчики. NSIS 2.0 был выпущен в свет 2 года спустя.

NSIS версии 1 был очень похож на классический Windows Installer, но он был более управлемым с помощью скриптов и поддерживал другие форматы сжатия. NSIS версии 2 поддерживает новый графический интерфейс пользователя, LZMA-сжатие, многоязычность и имеет хорошую систему плагинов.

Версия 2.01 была первой версией, поддерживающей компиляцию на любой из POSIX-платформ. Это позволило создавать Windows-инсталляторы на GNU/Linux и FreeBSD без использования эмулятора Wine. На данный момент поддерживается компиляция только для Windows.

▫ Описание

Компилятор NSIS — программа makensis — компилирует скрипты в исполняемый код. Каждая строчка скрипта содержит одну команду. Пример:
Код: Выделить весь код
 # Пример скрипта
 Name "Example1"
 OutFile "example1.exe"
 InstallDir "$PROGRAMFILES\Example1"
 Page Directory
 Page InstFiles
 Section
   SetOutPath $INSTDIR
   File ..\makensis.exe
 SectionEnd

Modern User Interface

В версии 2.0 был введён новый графический интерфейс пользователя, названный Modern UI (MUI). MUI очень похож на интерфейс мастеров, он поддерживает splash screen, выбора языка, выбор компонентов для установки и более широкие возможности настройки по сравнению со своим предшественником. Пример:
Код: Выделить весь код
 # Пример скрипта с Modern UI
 !include MUI.nsh
 Name "Example 2"
 OutFile Example2.exe
 !insertmacro MUI_PAGE_WELCOME
 !insertmacro MUI_PAGE_LICENSE "license.rtf"
 !insertmacro MUI_PAGE_DIRECTORY
 !insertmacro MUI_PAGE_COMPONENTS
 !insertmacro MUI_PAGE_INSTFILES
 !insertmacro MUI_PAGE_FINISH
 !insertmacro MUI_LANGUAGE "English"
 !insertmacro MUI_LANGUAGE "German"
 !insertmacro MUI_LANGUAGE "French"
 Section "Extract makensis"
  SetOutPath $INSTDIR
  File ..\makensis.exe
 SectionEnd
NSIS может быть расширен при помощи плагинов, которые могут быть написаны на C++, Си, и Delphi. Плагины могут быть использованы для улучшения функциональности и интерфейса инсталлятора. Плагины могут быть вызваны в любой части кода NSIS скрипта.

С пакетом NSIS поставляются несколько плагинов, позволяющих добавлять новые страницы, заменять фоновые изображения, скачивать файлы из Интернета, выполнять математические вычисления, обновлять файлы и многое другое.

▫ Программы, использующие NSIS


◦ Антивирус Касперского
◦ Qip
◦ 3DNA Desktop
◦ 7-Zip
◦ ATI Display Driver
◦ CDex
◦ Dev-C++
◦ DivX
◦ eMule FileZilla
◦ Google Picasa
◦ Google Talk
◦ Intel C (компилятор)
◦ IrfanView
◦ LightAllow
◦ LyX
◦ Miranda IM Mozilla Firefox 2.0
◦ NASA World Wind
◦ Notepad++
◦ OpenOffice.org для Windows
◦ Pidgin
◦ VLC Player
◦ Winamp

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?

В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


-------
Спасибо ВСЕМ за то, что тратите свое время, что бы ПОМОЧЬ МНЕ.

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:02, 09-12-2012

 

Аватара для AlekseyPopovv

Старожил


Сообщения: 169
Благодарности: 6

Профиль | Отправить PM | Цитировать


Нужно что то подобное, без MUI. Есть варианты?
Код: Выделить весь код
!include "MUI.nsh"

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "English"

${If} $Language == 1049
MessageBox MB_USERICON|MB_OK 'Программа "${APP}" уже запущена!'
Abort
${Else}
MessageBox MB_USERICON|MB_OK 'The "${APP}" is already running!'
Abort
${EndIf}

Отправлено: 11:35, 10-08-2023 | #2771



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить PM | Цитировать


AlekseyPopovv,
Разница между с MUI и без MUI в том, что
с MUI пишется
Код: Выделить весь код
!insertmacro MUI_LANGUAGE "Russian"
без MUI пишется
Код: Выделить весь код
LoadLanguageFile "${NSISDIR}\Contrib\Language files\Russian.nlf"
Дальше всё одинаково.

Кроме того локалицацию проще и правильнее прописывать так:
Код: Выделить весь код
; Подключение языковый файлов
; 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
Благодарности: 2

Профиль | Отправить PM | Цитировать


Ещё вопрос:
Можно ли "правильней" или "красивей" или по другому написать следующий код:

Код: Выделить весь код
        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

Отправлено: 19:07, 10-08-2023 | #2773


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить 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
2. Можно применить новый LogicLib-тест - RegKeyExists:
Код: Выделить весь код
SetRegView 64
${If} HKLM RegKeyExists "SOFTWARE\test"
  ; Существует
${Else}
  ; Ключ отсутствует ИЛИ недостаточно привилегий для доступа к ключу ИЛИ какая-то ошибка
${EndIf}
SetRegView 32
Код RegKeyExists:
Код: Выделить весь код
!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
Благодарности: 2

Профиль | Отправить 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
Благодарности: 2

Профиль | Отправить 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
Благодарности: 2

Профиль | Отправить 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
Благодарности: 192

Профиль | Отправить PM | Цитировать


inco1,
Обновил своё первое сообщение и поудалял некорректные/ненужные
Пример компилируется и работает корректно.

Если вдруг будут ошибки компилятора, то нужно читать, что именно не так.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:27, 10-08-2023 | #2778


Пользователь


Сообщения: 93
Благодарности: 2

Профиль | Отправить PM | Цитировать


iglezz,

Огромнейшее спасибо за помощь.
В процессе проб и тестов присмотрелся к своему первоначальному коду и упростил его. Получился простой код и работает, как и раньше корректно. Вот, что получилось:

Код: Выделить весь код
               ClearErrors
               EnumRegKey $0 HKLM "SOFTWARE\test" 0
               ${IfNot} ${Errors}
		  ; Существует
               ${Else}
		  ; Не существует
               ${EndIf}

Отправлено: 23:14, 10-08-2023 | #2779


Старожил


Сообщения: 352
Благодарности: 192

Профиль | Отправить 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



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » .: NSIS - все вопросы :. часть 2.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Инфо - [ликбез] Помощь начинающим .:[все вопросы]:. часть 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




 
Переход