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

Компьютерный форум 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

 

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


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

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


Да, речь идет о стороннем процессе. А можно сделать так - если процесс запустился то сразу его убить? И при этом чтобы инсталлятор продолжал работать

Отправлено: 19:49, 14-08-2013 | #451



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

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


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


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

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


Я же написал, скачай справку и в ней прочитай в указанной статье, там есть пример по убиению запущенного процесса. + там-же будет ссыль на требуемые файлы в работе.

Впрочем:
Весь текст по этой теме из нее.
читать дальше »

Автор: kotkovets
Последнее обновление: 01.09.2011

Собственно идея давно крутилась создать библиотеку для работы с процессами.
Так как существующие плагины для работы с процессами меня не устраивали своей функциональностью.
Много идей позаимствовал из интернета и оффицального сайта NSIS. И вот, что у меня получилось...
Загрузить (ссылку в справке смотреть надо)
Написанная мною библиотека полностью совместима с юникодной версией компилятора NSIS.
Гарантировано работает начиная от Windows 2000 и выше, независимо от разрядности системы х32 или х64.
Файл ProcessFunc.nsh копируем в папку ${NSISDIR}\Include, далее в скрипте подключаем данную библиотеку.


!include "ProcessFunc.nsh"



Поиск запущенного процесса по имени процесса

По указанному имени ищем запущенный процесс
${FindProcessName} "process.exe" $var
process.exe - Имя процесса с расширением, которое требуется найти.
возвращаемые значения в указанную переменную $var

$var = 1 -процесс найден.
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${FindProcessName} "explorer.exe" $0

StrCmp $0 0 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"

StrCmp $0 none 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"



Логическая конструкция поиска запущенного процесса


${If} ${ProcessExists} "explorer.exe"
MessageBox MB_ICONINFORMATION|MB_OK "Проводник запущен!"
# здесь будет выполняться код, если процесс запущен
${Else}
MessageBox MB_ICONINFORMATION|MB_OK "Проводник не запущен!"
# здесь будет выполняться код, если процесс не запущен
${EndIf}



Определение PID запущенного процесса

Process ID - это уникальный идентификатор процесса, номер, который система назначает каждому активному процессу.
Этот номерок несет очень много информации о процессе.
${FindProcessPID} "process.exe" $var

process.exe - Имя процесса с расширением, которое требуется найти.
Возвращаемые значения в указанную переменную $var

$var = PID -PID процесса
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов



Поиск пути запущенного процесса

По имени процесса определяем путь к запущенному процессу

${FindProcessPath} "process.exe" $var
process.exe - Имя процесса с расширением, которое требуется найти.
Возвращаемые значения в указанную переменную $var

$var = путь к активному процессу
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${FindProcessPath} "explorer.exe" $2
StrCmp $2 none +3 +1
StrCmp $2 error +2 +1
MessageBox MB_ICONINFORMATION|MB_OK "Путь к процессу [ explorer ]:$\n $2"

StrCmp $2 none +1 +2
MessageBox MB_ICONINFORMATION|MB_OK "Процесс [ explorer ] не найден"

StrCmp $2 error +1 +2
MessageBox MB_ICONINFORMATION|MB_OK "Process error"



Завершение запущенного процесса


${KillProcess} "process.exe" $var

process.exe - Имя процесса с расширением, которое требуется завершить.
Возвращаемые значения в указанную переменную $var

$var = 1 - процесс успешно завершен.
код возврата 1 обусловлен тем, что бы проводник завершался,
а не перезапускался, так, как это делает диспетчер задач.
$var = 2 -процесс не завершен.
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

${KillProcess} "explorer.exe" $4
${If} $4 == 1
MessageBox MB_ICONINFORMATION|MB_OK "Процесс завершен [ explorer ]:$\n$$4 = $4"
Exec "explorer.exe" # запускаем проводник
${ElseIf} $4 == 2
MessageBox MB_ICONINFORMATION|MB_OK "Процесс не завершен [ explorer ]:$\n$$4 = $4"
${ElseIf} $4 == none
MessageBox MB_ICONINFORMATION|MB_OK "$$4 = $4$\nПроцесс[ explorer ] не найден"
${ElseIf} $4 == error
MessageBox MB_ICONINFORMATION|MB_OK "Process error"
${EndIf}


Ожидание завершения запущенного процесса заданное время

Данный макрос заставит установщик ждать завершение запущенного процесса,
или ждать заданное время, не ожидая завершения процесса.

${ProcessWait} "process.exe" "time" $var
process.exe - Имя процесса с расширением, который установщик будет ждать.
time - указанное время в миллисекундах, если указать константу ${INFINITE} или -1
установщик будет ждать завершения процесса.
Возвращаемые значения в указанную переменную $var

$var = 1 -ожидание завершено успешно
$var = none -процесс не найден.
$var = error -ошибка получения снимка запущенных процессов

В данном примере установщик будет ждат 2 секунды, когда проводник запущен.

${ProcessWait} "explorer.exe" "2000" $5 # ожидание 2 секунды
StrCmp $5 none +3
StrCmp $5 error +2
MessageBox MB_ICONINFORMATION|MB_OK "Ожидание процесса [ explorer.exe ] \
2 секунды, завершено успешно! $\n$$5 = $5"

StrCmp $5 none 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "$$5 = $5$\nПроцесс[ explorer ] не найден"

StrCmp $5 error 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "$$5 = $5$\nProcess"



Запуск внешних приложений в режиме ожидания завершения приложения

Консольные приложения будут запущены в скрытном режиме.

${ExecWait} "app.exe [parametr1]...[parametr2]" $var
app.exe [parametr1]...[parametr2] - путь к запускаемоому приложению и ключи запуска приложения
Возвращаемые значения в указанную переменную $var

$var = 0 -приложение завершено успешно.
$var = 1 -приложение внезапно прервано.
$var = 2 -приложение завершено с ошибкой.
$var = код возврата -число, код возврата, которое возвращает приложение.
$var = error -ошибка запуска приложения.

${ExecWait} "calc.exe" $6
StrCmp $6 error +2
# если завершить через диспетчер задач, то код возврата в $6 = 1
DetailPrint "ExecWait [ calc.exe ] exitcode: $6"

StrCmp $6 error 0 +2
MessageBox MB_ICONINFORMATION|MB_OK "error"



Перечисление запущенных процессов


${EnumProcess} Function
Function - имя пользовательской функции.
В функции Function доступны для использования только переменные $R0 - $R9
Переменые $0 - $9 используются макросом!
Функция возвращает следующие значения:
$3 - идентификатор процесса
$4 - приоритет процесса, принимает следующие значения:

Idle -Низкий приоритет.
Below Normal -Приоритет ниже нормального.
Normal -Нормальный приоритет.
Above Normal -Приоритет выше нормального.
High -Высокий приоритет.
Real Time -Приоритет реального времени, программа выполняется так, что все ресурсы отдаются ей.

$5 - имя процесса.
$6 - путь к процессу.
$7 - пользователь от имени которого запущен процесс.
В случае ошибки макрос устанавливает флаг ошибки

!include "MUI2.nsh"
!include "ProcessFunc.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile TestProcEnum.exe
Caption "ProcessEnum"
Name "ProcessEnum test"

Section "EnumProc"
${EnumProcess} Process
IfErrors 0 +2
MessageBox MB_ICONSTOP|MB_OK "Error createsnapshot!"
SectionEnd

Function Process
DetailPrint "*********************************"
DetailPrint "PID = $3" #идентификатор процесса
DetailPrint "Priority = $4" #приоритет процесса
DetailPrint "Name = $5" #имя процесса
DetailPrint "Path = $6" #путь к процессу
DetailPrint "UserName = $7" #имя пользователя процесса
FunctionEnd

Последний раз редактировалось MaGoth, 14-08-2013 в 20:01.


Отправлено: 19:55, 14-08-2013 | #452


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


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

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


Привет народ,
Очередной вопрос появился и понять не могу, это мой косяк или Нсисовский...

Имеем:
- для инсталляции 4 версии файлов + либы, в зависимости от ОС для определенной программы.
Код установки простенький, привожу только кусок самой установки файлов для определенного языка программы и под конкретную ОС:

читать дальше »
...
!insertmacro GLOBAL_WinVersion

${If} $WVER == "5.1" ;WinXP
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-1.dll"
Goto Winst
${ElseIf} $WVER == "6.0" ;WinVista
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.1" ;Win7
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.2" ;Win8
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\w8\file.exe"
File ".\setup\pack-en\w8\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${ElseIf} $WVER == "6.3" ;Win8-Blue
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\w8\file.exe"
File ".\setup\pack-en\w8\file-2.exe"
File ".\setup\pack\wx\Library-2.dll"
Goto Winst
${Else}
SetOutPath "$INSTDIR\System"
File ".\setup\pack-en\file.exe"
File ".\setup\pack-en\file-2.exe"
File ".\setup\pack\wx\Library-1.dll"
Goto Winst
${EndIf}

Winst:
SetOutPath "$INSTDIR\links"
...

Ну, а далее папки и прочие ярлыки в меню Пуск..

Размер для файлов в среднем такой:
file.exe - 9 МБ
file-2.exe - 12 КБ
Library-1.dll - 150 КБ
Library-2.dll - 80 КБ (ставится отдельным макросом в зависимости от разного назначения)

Вроде как, инсталлер правильно определяет размер всех файлов в совокупности включенных в компиляцию инсталлера.
Вопрос в том, почему при выборе только одной секции из 4 возможных, он указывает в поле: "Размер устанавливаемых файлов", число, соответствующее сразу всем файлам включенных в инсталлятор - 59 МБ.
А не конкретно тех, которые отмечены к установке, в которой будет от силы - 10 МБ... ?!

Зы, Сижу под Юникодом.
Зы-зы, В догонку вопрос по Win8-Blue:
В вики пишут что ядро у нее:
Цитата:
Версия ядра NT 6.3 (в Windows 8 использовалось ядро NT 6.2)
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2.

Картинко:
http://yadi.sk/d/VGPlu9Ee7xand
На скрине видно что у Оси версия - 6.3, а инсталлер выдает старый номер. Где в ней откопать этот номерок чтобы по нему сверятся, ибо пока, тут ничего не понятно..
Или может мысли какие есть ?!

Последний раз редактировалось MaGoth, 15-08-2013 в 20:59.


Отправлено: 18:38, 15-08-2013 | #453


Аватара для kotkovets

Ветеран


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

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


Цитата MaGoth:
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2. »
фиг его знает...
проверь под winver.nsh:
Код: Выделить весь код
${WinVerGetMajor} $1 ;старшая цифра версии win 
${WinVerGetMinor} $2 ;младшая цифра версии win
${WinVerGetBuild} $3
MessageBox MB_OK "$1$2 WinVerGetBuild = $3" IDOK
Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...

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


Последний раз редактировалось kotkovets, 15-08-2013 в 22:31.


Отправлено: 22:22, 15-08-2013 | #454


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


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

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


Вложения
Тип файла: zip Example.zip
(10.4 Kb, 17 просмотров)

Подскажите, пожалуйста, почему могут плохо переключаться компоненты?
"Эффект" проявляется после добавления кода, выделенного красным. Т.е. компоненты переключаются, но можно выбрать сразу два. Если переключить их несколько раз, работоспособность восстанавливается - как будто что-то удерживает состояние выбранного компонента (не соображу, как правильно сформулировать).
Причем проявляется не сразу, а только после возврата с кастомной странички, например, для выбора другой версии файла.
Приложен архив с эти сценарием. При наличии указанных в !include файлов, можно скомпилировать и посмотреть.
читать дальше »

Код: Выделить весь код
!include "MUI2.nsh"
;!include "VPatchLib.nsh"
!include "Logiclib.nsh"
!include "WinVer2.nsh"
!include "ProcessFunc.nsh"
SetCompressor /SOLID lzma
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\Example\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!define MUI_ABORTWARNING
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!define SWP_SHOWWINDOW 0x00000040
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_COMPONENTS
Page custom CustomInfo
!insertmacro MUI_PAGE_INSTFILES
;-----------------------------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
;--------------------------------------------------------------------
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
Caption "Example"
OutFile "example.exe"
RequestExecutionLevel admin
;-------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
Section /o "$(PROGRUS)" SecRUS
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR)" SecUKR
  SetOutPath $INSTDIR
     CreateDirectory "$INSTDIR\Backup"
     ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGRUS64)" SecRUS64
  SetOutPath $INSTDIR
     CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR64)" SecUKR64
   SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section "-Post"
   WriteUninstaller "$INSTDIR\Uninstall.exe"
   SetAutoClose false
SectionEnd
;--------------------------------
Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
; Для "красоты": версия, разрядность ОС
   ${WinName} $1
   ${WinType} $2
   ${WinServerName} $3
   ${WinServicePack} $4
   ${WinPlatformArchitecture} $5 
   StrCpy $6 "$1 $2 $3 $4 (x$5)"
   Var /Global text5
   StrCpy $text5 "$6" ; что получилось - на кастомную страницу
; Определяем разрядность ОС для скрытия ненужных компонентов
   Var /Global IsWow64Process
   System::Call kernel32::GetCurrentProcess()i.s
   System::Call kernel32::IsWow64Process(is,*i.s)
   Pop $IsWow64Process
   StrCmp $IsWow64Process "1" 0 +3
   call Is64Bit
   goto +2
   call Is32Bit
; ТАК ПРОЩЕ, кажется. Собираем информацию о системе и, 
; заодно , используем $5 для скрытия ненужных компонентов
   ;${WinName} $1
   ;${WinType} $2
   ;${WinServerName} $3
   ;${WinServicePack} $4
   ;${WinPlatformArchitecture} $5 
   ;StrCpy $6 "$1 $2 $3 $4 (x$5)"
   ;Var /Global text5
   ;StrCpy $text5 "$6" ; что получилось - на кастомную страницу
         ;StrCmp $5 "64" 0 +3
   ;call Is64Bit
   ;goto +2
   ;call Is32Bit
FunctionEnd
;---------------------------------------------------------
Function MUIGUIInit
; Получаем CRC exe-файла в папке установленной программы
   CRCCheck::GenCRC "$INSTDIR\WinSnap64.exe"
   Pop $R1
   CRCCheck::GenCRC "$INSTDIR\WinSnap.exe"
   Pop $R2
   StrCpy $1 $R1
   StrCpy $2 $R2
; Определяем, что установлено: оригинал или локализация.
## скрипт определения
FunctionEnd
;---------------------------------------------------------------
Function Is64Bit
; Скрываем секции, если процесс 64 битный
  SectionSetText ${SecRUS} ""
  SectionSetText ${SecUKR} ""
FunctionEnd
Function Is32Bit
; Скрываем секции, если процесс 32 битный
  SectionSetText ${SecRUS64} ""
  SectionSetText ${SecUKR64} ""
FunctionEnd
;-----------------------------------------------------------------
Function .onSelChange
; Выбор только одного компонента из 4
  !insertmacro StartRadioButtons $1
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons
FunctionEnd
;-----------------------------------------------------------------------
Function ComponentsLeave
; Принуждаем пользователя выбрать какой-либо компонент, если забыл
${IfNot} ${SectionIsSelected} ${SecRUS}
${AndIfNot} ${SectionIsSelected} ${SecUKR}
${AndIfNot} ${SectionIsSelected} ${SecRUS64}
${AndIfNot} ${SectionIsSelected} ${SecUKR64}
  MessageBox MB_OK "$(not_component)" ; Предупреждение о не выбранном компоненте
  Abort
${EndIf}
; ВОТ С ЭТИМ ПЛОХО ПЕРЕКЛЮЧАЮТСЯ КОМПОНЕНТЫ; На инфо странице указываем, какой язык локализации
  SectionGetFlags ${SecRUS} $0
  SectionGetFlags ${SecUKR} $1
  SectionGetFlags ${SecRUS64} $2
  SectionGetFlags ${SecUKR64} $3
Var /Global text_lang
    StrCmp $0 "1" +2 0
    StrCmp $2 "1" 0 +3
           StrCpy $4 "$(lang_rus)"
           StrCpy $text_lang "$4"
    StrCmp $1 "1" +2 0
    StrCmp $3 "1" 0 +3
           StrCpy $4 "$(lang_ukr)"
           StrCpy $text_lang "$4"
FunctionEnd

Function CustomInfo
!insertmacro MUI_HEADER_TEXT $(confirm_select) $(confirm_select_subtitle)
  InitPluginsDir
  File /oname=$PLUGINSDIR\msg.ini "msg.ini"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 1" "Text" "$(text1)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 2" "Text" "$(text2)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 4" "Text" "$(text4)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 5" "Text" "$text5"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 6" "Text" "$(text6)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 7" "Text" "$INSTDIR"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 8" "Text" "$(text8)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 9" "Text" "$(text9)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 10" "Text" "$text_lang"
  
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\msg.ini"
InstallOptions::show
FunctionEnd
;-----------------------------------------
; Раздел (секция) деинсталлятора
Section "un.install" ;SecUN
   delete "$INSTDIR\WinSnap64.exe"
   delete "$INSTDIR\WinSnap.exe"
   Rename $INSTDIR\Backup\WinSnap64.exe.bak $INSTDIR\WinSnap64.exe
   Rename $INSTDIR\Backup\WinSnap.exe.bak $INSTDIR\WinSnap.exe
   delete "$INSTDIR\Uninstall.exe"
   DeleteRegKey HKLM "Software\Alexander Avdonin\WinSnap\Option"
   RMDir /r "$INSTDIR\Backup"
   SetAutoClose false
SectionEnd
;----------------------------------------------------------------
LangString text2 ${LANG_RUSSIAN} "Установка будет выполнена со следующими параметрами:"
LangString text2 ${LANG_UKRAINIAN} "Встановлення буде виконано з наступними параметрами:"
LangString text9 ${LANG_RUSSIAN} "Выбранный язык WinSnap:"
LangString text9 ${LANG_UKRAINIAN} "Обрана мова WinSnap:"
LangString lang_rus ${LANG_RUSSIAN} "Русский язык"
LangString lang_rus ${LANG_UKRAINIAN} "Російська мова"
LangString lang_ukr ${LANG_RUSSIAN} "Украинский язык"
LangString lang_ukr ${LANG_UKRAINIAN} "Українська мова"
LangString text4 ${LANG_RUSSIAN} "Операционная система:"
LangString text4 ${LANG_UKRAINIAN} "Операційна система:"
LangString text6 ${LANG_RUSSIAN} "Папка установки файлов:"
LangString text6 ${LANG_UKRAINIAN} "Папка призначення:"
LangString confirm_select ${LANG_RUSSIAN} "Подготовка завершена!"
LangString confirm_select ${LANG_UKRAINIAN} "Підготовку завершено!"
LangString confirm_select_subtitle ${LANG_RUSSIAN} "Все готово к локализации программы"
LangString confirm_select_subtitle ${LANG_UKRAINIAN} "Усе підготовлено до локалізації програми"
; Текст сообщения, когда устанавливаемый компонент не выбран
LangString not_component ${LANG_RUSSIAN} "Для продолжения выберите желаемую версию перевода !"
LangString not_component ${LANG_UKRAINIAN} "Щоб продовжити, оберіть бажану версію перекладу !"
; Текст названия компонента (раздела, секции)
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"


P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3.
Цитата:
!verbose: Invalid verbose level
Error in macro _KillProcessCall on macroline 2

Последний раз редактировалось Kopejkin, 18-08-2013 в 20:53.


Отправлено: 02:59, 17-08-2013 | #455


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


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

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


kotkovets,
Привет народ.
Цитата:
Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...
Короче, после ковыряний стало более менее понятно, тестилось на сборках инсталляшки под Анси и Юникод.
Это баг в API, конкретно в функции GetVersionEX. Она сообщает версию 6.2 и билд 9200.



Для Win8-Blue правильная версия - 6.3.


Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?!

Отправлено: 19:59, 17-08-2013 | #456


Аватара для kotkovets

Ветеран


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

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


Цитата Kopejkin:
Подскажите, пожалуйста, почему могут плохо переключаться компоненты? »
Потому что, изначально неопределенное состояние секций изначально, нужно определять в "первой" функции инсталлятора...
потому что макросу радиобутон изначально от чего то нужно переключать секции, а когда с нечего начать...
1. а именно делаем секцию отмеченную в зависимости от выбранного языка (это сильно упрощает код)
2 много лишних действий с определением разрядность оси, она уже определена в макросе ${WinPlatformArchitecture} т.е в переменной $5
значит нужно изымать лишниие функции...
ну примерно так:
читать дальше »
Код: Выделить весь код
!include "MUI2.nsh"
;!include "VPatchLib.nsh"
!include "Logiclib.nsh"
!include "WinVer2.nsh"
!include "ProcessFunc.nsh"
SetCompressor /SOLID lzma
;!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
;!define MUI_LANGDLL_REGISTRY_KEY "Software\Example\Option"
;!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!define MUI_ABORTWARNING
!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!define SWP_SHOWWINDOW 0x00000040
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!define MUI_COMPONENTSPAGE_SMALLDESC
!insertmacro MUI_PAGE_COMPONENTS
Page custom CustomInfo
!insertmacro MUI_PAGE_INSTFILES
;-----------------------------------------------------
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES

!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
;--------------------------------------------------------------------
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
Caption "Example"
OutFile "example.exe"
RequestExecutionLevel admin
;-------------------------------------------------------
!insertmacro MUI_RESERVEFILE_LANGDLL
;--------------------------------
Section /o "$(PROGRUS)" SecRUS
  SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR)" SecUKR
  SetOutPath $INSTDIR
     CreateDirectory "$INSTDIR\Backup"
     ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGRUS64)" SecRUS64
  SetOutPath $INSTDIR
     CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section /o "$(PROGUKR64)" SecUKR64
   SetOutPath $INSTDIR
    CreateDirectory "$INSTDIR\Backup"
    ;!insertmacro VPatchFile
SectionEnd
Section "-Post"
   WriteUninstaller "$INSTDIR\Uninstall.exe"
   SetAutoClose false
SectionEnd
;--------------------------------
Function .OnInit
!insertmacro MUI_LANGDLL_DISPLAY
; Для "красоты": версия, разрядность ОС
   ${WinName} $1
   ${WinType} $2
   ${WinServerName} $3
   ${WinServicePack} $4
   ${WinPlatformArchitecture} $5
   Var /Global text5
   StrCpy $text5 "$1 $2 $3 $4 (x$5)" ; что получилось - на инфо страницу
${If} $5 == 64
   ;Скрываем секции, если процесс 64 битный
     SectionSetText ${SecRUS} ""
     SectionSetText ${SecUKR} ""
     ${If} $LANGUAGE == ${LANG_RUSSIAN}
          StrCpy $R9 ${SecRUS64}
          SectionSetFlags ${SecRUS64} ${SF_SELECTED}
     ${ElseIf} $LANGUAGE == ${LANG_UKRAINIAN}
          StrCpy $R9 ${SecUKR64}
          SectionSetFlags ${SecUKR64} ${SF_SELECTED}
     ${EndIf}
${ElseIf} $5 == 32
; Скрываем секции, если процесс 32 битный
    SectionSetText ${SecRUS64} ""
    SectionSetText ${SecUKR64} ""
    ${If} $LANGUAGE == ${LANG_RUSSIAN}
          StrCpy $R9 ${SecRUS}
          SectionSetFlags ${SecRUS} ${SF_SELECTED}
    ${ElseIf} $LANGUAGE == ${LANG_UKRAINIAN}
          StrCpy $R9 ${SecUKR}
          SectionSetFlags ${SecUKR} ${SF_SELECTED}
    ${EndIf}
${EndIf}

FunctionEnd

;---------------------------------------------------------
Function MUIGUIInit
; Получаем CRC exe-файла в папке установленной программы
   CRCCheck::GenCRC "$INSTDIR\WinSnap64.exe"
   Pop $R1
   CRCCheck::GenCRC "$INSTDIR\WinSnap.exe"
   Pop $R2
   StrCpy $1 $R1
   StrCpy $2 $R2
; Определяем, что установлено: оригинал или локализация.
## скрипт определения
FunctionEnd

;-----------------------------------------------------------------
Function .onSelChange
; Выбор только одного компонента из 4
  !insertmacro StartRadioButtons $R9
    !insertmacro RadioButton ${SecRUS}
    !insertmacro RadioButton ${SecUKR}
    !insertmacro RadioButton ${SecRUS64}
    !insertmacro RadioButton ${SecUKR64}
  !insertmacro EndRadioButtons
FunctionEnd
;-----------------------------------------------------------------------
Function ComponentsLeave
  SectionGetFlags ${SecRUS} $0
  SectionGetFlags ${SecUKR} $1
  SectionGetFlags ${SecRUS64} $2
  SectionGetFlags ${SecUKR64} $3
Var /Global text_lang
    StrCmp $0 "1" +2 0
    StrCmp $2 "1" 0 +3
           StrCpy $4 "$(lang_rus)"
           StrCpy $text_lang "$4"
    StrCmp $1 "1" +2 0
    StrCmp $3 "1" 0 +3
           StrCpy $4 "$(lang_ukr)"
           StrCpy $text_lang "$4"
FunctionEnd

Function CustomInfo
!insertmacro MUI_HEADER_TEXT $(confirm_select) $(confirm_select_subtitle)
  InitPluginsDir
  File /oname=$PLUGINSDIR\msg.ini "msg.ini"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 1" "Text" "$(text1)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 2" "Text" "$(text2)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 4" "Text" "$(text4)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 5" "Text" "$text5"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 6" "Text" "$(text6)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 7" "Text" "$INSTDIR"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 8" "Text" "$(text8)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 9" "Text" "$(text9)"
  WriteINIStr $PLUGINSDIR\msg.ini "Field 10" "Text" "$text_lang"
  
InstallOptions::initDialog /NOUNLOAD "$PLUGINSDIR\msg.ini"
InstallOptions::show
FunctionEnd
;-----------------------------------------
; Раздел (секция) деинсталлятора
Section "un.install" ;SecUN
   delete "$INSTDIR\WinSnap64.exe"
   delete "$INSTDIR\WinSnap.exe"
   Rename $INSTDIR\Backup\WinSnap64.exe.bak $INSTDIR\WinSnap64.exe
   Rename $INSTDIR\Backup\WinSnap.exe.bak $INSTDIR\WinSnap.exe
   delete "$INSTDIR\Uninstall.exe"
   DeleteRegKey HKLM "Software\Alexander Avdonin\WinSnap\Option"
   RMDir /r "$INSTDIR\Backup"
   SetAutoClose false
SectionEnd
;----------------------------------------------------------------
LangString text2 ${LANG_RUSSIAN} "Установка будет выполнена со следующими параметрами:"
LangString text2 ${LANG_UKRAINIAN} "Встановлення буде виконано з наступними параметрами:"
LangString text9 ${LANG_RUSSIAN} "Выбранный язык WinSnap:"
LangString text9 ${LANG_UKRAINIAN} "Обрана мова WinSnap:"
LangString lang_rus ${LANG_RUSSIAN} "Русский язык"
LangString lang_rus ${LANG_UKRAINIAN} "Російська мова"
LangString lang_ukr ${LANG_RUSSIAN} "Украинский язык"
LangString lang_ukr ${LANG_UKRAINIAN} "Українська мова"
LangString text4 ${LANG_RUSSIAN} "Операционная система:"
LangString text4 ${LANG_UKRAINIAN} "Операційна система:"
LangString text6 ${LANG_RUSSIAN} "Папка установки файлов:"
LangString text6 ${LANG_UKRAINIAN} "Папка призначення:"
LangString confirm_select ${LANG_RUSSIAN} "Подготовка завершена!"
LangString confirm_select ${LANG_UKRAINIAN} "Підготовку завершено!"
LangString confirm_select_subtitle ${LANG_RUSSIAN} "Все готово к локализации программы"
LangString confirm_select_subtitle ${LANG_UKRAINIAN} "Усе підготовлено до локалізації програми"
; Текст сообщения, когда устанавливаемый компонент не выбран
LangString not_component ${LANG_RUSSIAN} "Для продолжения выберите желаемую версию перевода !"
LangString not_component ${LANG_UKRAINIAN} "Щоб продовжити, оберіть бажану версію перекладу !"
; Текст названия компонента (раздела, секции)
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"

Цитата MaGoth:
Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?! »
мистика... зы..

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

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

Отправлено: 12:27, 18-08-2013 | #457


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


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

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


kotkovets, спасибо большое!
А я все никак не мог сообразить, как привязать компонент к выбранному языку установки.

Отправлено: 14:05, 18-08-2013 | #458


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


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

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


Цитата Kopejkin:
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »
На сколько я знаю Виктор займется своей сборкой билда Нсис когда выйдет нормальный релиз.
В его сборках много всяких правок оригинальных косяков и прочих полезностей..
Сам жду, чтобы на троечку переехать с ее вкусняшками...

Цитата kotkovets:
мистика... зы.. »
Членово...

Отправлено: 14:20, 18-08-2013 | #459


Аватара для kotkovets

Ветеран


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

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


Цитата MaGoth:
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »
подправил под NSIS 3.XX, также работает и в предыдущих версиях. тестируйте...
http://yadi.sk/d/p-Uquod_821WI

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


Последний раз редактировалось kotkovets, 17-11-2013 в 02:10.

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

Отправлено: 17:09, 18-08-2013 | #460



Компьютерный форум 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




 
Переход