Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Привет народ, :)
Требуется небольшая помощь с определением Осей в инсталляшке.
Задача:
Если Ось ХР и разрешение экрана выше чем: 2048 пикселей, - установить один файл в указанный каталог.
Если Ось Виста, Севен или Осьмушка, и разрешение экрана выше чем 2048 пикселей, установить другой файл в указанную директорию.
Номера, битности и прочее значения не имеют..
За примерчик с описанием был бы очень благодарен.
Зы, Использую, версию юникод - 2,46,5, если что.
Kopejkin
12-08-2013, 20:39
В Справочнике по NSIS есть два уже готовых примера: "Определение операционной системы" и "Определяем и меняем разрешение экрана". Подгоняйте под свои потребности.
tony1990
13-08-2013, 12:36
MKN, в твоём примере 3 Использование функции CreateWindowEx для создания кнопки кнопка работает только в верхней и нижней части экрана. Если ты изменишь координату Y на 100, она уже не работает. Что странно, ведь ты создаёшь кастомную страницу, а мне тут писали что перекрывается стандартными контролами, потому и не работает. Я правда правлю стандартную страницу (components page)
icq99999999
14-08-2013, 13:57
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя
В Справочнике по NSIS есть два уже готовых примера: "Определение операционной системы" и "Определяем и меняем разрешение экрана". Подгоняйте под свои потребности. »
Спасибо, уже без справки разобрался.
Теперь другие вопросы появились, ибо нигде не увидел инфы или какого либо вразумительного описания, на те или иные моменты в создании инсталлера под Вин8.
Собственно, как Нсис с ней работает, нормально или не поддерживает вообще?
Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?!
Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы...
Собственно задача моя простая, сделать инсталляшку для Осей: (ХР), (Виста, Севен) и (Осьмушка). При установке определяется разрешение экрана, после его определения в зависимости от ОС, устанавливаются те или иные исполняемые файлы, на ту или иную версию программы... И т.д..
Зы, При условии что ОС 8 стоит особняком от остальных Осей.
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя »
Не уверен что первое возможно без каких либо костылей, ибо не понятно, откуда программе узнать что юзер ее запускает с ключом.
Второе не проблема,
Прописываем в скрипте сверху, например:
!define PROG_BASE "MyProg"
далее в коде, где требуется вызываем, создание папки времянки и копирование в нее требуемых файлов:
SetOutPath "$TEMP\${PROG_BASE} Installation\"
File ".\путь к твоим файлам"
Далее, по коду:
Запускаем твою прогу, так как тебе нужно, командами:
Exec '"$TEMP\${PROG_BASE} Installation\someprogram.exe"'
Команда с передачей параметров запускаемому файлу:
Exec '"$TEMP\${PROG_BASE} Installation\someprogram.exe" ваши_параметры'
или
ExecWait '"$TEMP\${PROG_BASE} Installation\someprogram.exe"' $0
Где $0 переменная, в которую будет помещен код завершения (не обязательно)
Далее, по окончании работы инсталлера, где-нить в последней секции, прописываем убиение времянки в каталоге темп:
Function .onGUIEnd
RmDir /r /REBOOTOK "$TEMP\${PROG_BASE} Installation"
FunctionEnd
Вроде все...
Vincent7
14-08-2013, 18:20
Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как?
Можно, смотри справку по Нсис, в части:
Примеры кодов:
- Работа с процессами с помощью NSIS
Ссылка на справку в шапке темы.
Хотя нет, тебе же заблочить процесс надо, а не закрыть, скорее всего нет. Хотя может кто и подскажет вариант...
Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?!
Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы... »
Примеры кодов => Определение ОС
(читайте поновее способ от kotkovets)
!include "WinVer2.nsh"
outfile "OS_TEST.exe"
Function .onInit
${WinVersion} $0
${WinVersionMajor} $1
${WinVersionMinor} $2
MessageBox MB_OK|MB_ICONINFORMATION " WinVersion = $0 $\n$\n WinVersionMajor = $1 $\n$\n WinVersionMinor = $2"
quit
FunctionEnd
Section
SectionEnd
У Windows 7 => 6.1
У Windows 8 => 6.2
---
можно ли чтобы при запуске созданного установщика с ключом , выполнялся определённый файл?
а при обычном запуске , все распаковывалось в временную папку и запускался определенный файл2
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя »
Перевод справки NSIS => GetParameters: получаем командную строку инсталлятора
Перевод справки NSIS => GetOptions: обрабатываем значение ключа в параметре запуска инсталлятора
+
Перевод справки NSIS => File: Добавляем файлы в инсталлятор
Перевод справки NSIS => Exec: запускаем приложения
Перевод справки NSIS => ExecWait: ждём завершения исполнения приложения
---
Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как? »
Если речь идёт о процессе инсталлятора, то в какой ситуации это необходимо? После чего тормозить процесс и после какого события возобновлять процесс установки?
А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить)
kotkovets
14-08-2013, 19:06
ибо не понятно, откуда программе узнать что юзер ее запускает с ключом »
С помощью переменной $CMDLINE ну а дальше разбор строки:
заведи с ключом /key ..
!include "FileFunc.nsh"
!include "LogicLib.nsh"
outfile test.exe
Section
ClearErrors
${GetOptions} "$CMDLINE" "/key" $R0
${IfNot} ${Errors}
MessageBox MB_OK "Запуск с ключом: /key" IDOK
${EndIf}
SectionEnd
схема работает на основе флага ошибки, поэтому для определения другога (следующего) ключа,
нужно сбрасывать флаг ошибки командой ClearErrors
K.A.V,
Ай спасибки камраден. :)
А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить) »
Именно он и имелся ввиду.
Зы, Побег тестить примерчики... :)
Vincent7
14-08-2013, 19:49
Да, речь идет о стороннем процессе. А можно сделать так - если процесс запустился то сразу его убить? И при этом чтобы инсталлятор продолжал работать
Я же написал, скачай справку и в ней прочитай в указанной статье, там есть пример по убиению запущенного процесса. + там-же будет ссыль на требуемые файлы в работе.
Впрочем:
Весь текст по этой теме из нее.
Автор: 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
Привет народ, :)
Очередной вопрос появился и понять не могу, это мой косяк или Нсисовский...
Имеем:
- для инсталляции 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 МБ. :o
А не конкретно тех, которые отмечены к установке, в которой будет от силы - 10 МБ... ?!
Зы, Сижу под Юникодом. :)
Зы-зы, В догонку вопрос по Win8-Blue:
В вики пишут что ядро у нее:
Версия ядра NT 6.3 (в Windows 8 использовалось ядро NT 6.2)
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2.
Картинко:
http://yadi.sk/d/VGPlu9Ee7xand
На скрине видно что у Оси версия - 6.3, а инсталлер выдает старый номер. Где в ней откопать этот номерок чтобы по нему сверятся, ибо пока, тут ничего не понятно..
Или может мысли какие есть ?!
kotkovets
15-08-2013, 22:22
Получается либо они звиздят, либо версия ядра и версия Винды это разные вещи, либо еще что-то...
То что выдается плагином по определению версии, это - 6.2. »
фиг его знает...
проверь под winver.nsh:
${WinVerGetMajor} $1 ;старшая цифра версии win
${WinVerGetMinor} $2 ;младшая цифра версии win
${WinVerGetBuild} $3
MessageBox MB_OK "$1$2 WinVerGetBuild = $3" IDOK
Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...:)
Kopejkin
17-08-2013, 02:59
Подскажите, пожалуйста, почему могут плохо переключаться компоненты?
"Эффект" проявляется после добавления кода, выделенного красным. Т.е. компоненты переключаются, но можно выбрать сразу два. Если переключить их несколько раз, работоспособность восстанавливается - как будто что-то удерживает состояние выбранного компонента (не соображу, как правильно сформулировать).
Причем проявляется не сразу, а только после возврата с кастомной странички, например, для выбора другой версии файла.
Приложен архив с эти сценарием. При наличии указанных в !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
kotkovets,
Привет народ. :)
Смотри по номеру билда, может номерок не совпадает... апи не будет врать...
может быть библиотека kernel32.dll прежней версии осталась (оттуда берутся данные)
если все совпадает - звиздят...
Короче, после ковыряний стало более менее понятно, тестилось на сборках инсталляшки под Анси и Юникод.
Это баг в API, конкретно в функции GetVersionEX. Она сообщает версию 6.2 и билд 9200.
http://i.imgur.com/JLnDxHTs.png (http://imgur.com/JLnDxHT) http://i.imgur.com/ZoZRCA8s.png (http://imgur.com/ZoZRCA8) http://i.imgur.com/uEDHxI6s.png (http://imgur.com/uEDHxI6)
Для Win8-Blue правильная версия - 6.3.
Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?!
kotkovets
18-08-2013, 12:27
Подскажите, пожалуйста, почему могут плохо переключаться компоненты? »
Потому что, изначально неопределенное состояние секций изначально, нужно определять в "первой" функции инсталлятора...
потому что макросу радиобутон изначально от чего то нужно переключать секции, а когда с нечего начать...
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)"
Зы, Есть что ни будь по моему вопросу выше, о непонятках с размером устанавливаемых файлов ?! »
мистика...:) зы..
Kopejkin
18-08-2013, 14:05
kotkovets, спасибо большое! :up
А я все никак не мог сообразить, как привязать компонент к выбранному языку установки.
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »
На сколько я знаю Виктор займется своей сборкой билда Нсис когда выйдет нормальный релиз.
В его сборках много всяких правок оригинальных косяков и прочих полезностей..
Сам жду, чтобы на троечку переехать с ее вкусняшками... :)
мистика... зы.. »
Членово... :(
kotkovets
18-08-2013, 17:09
P.S. Я так понимаю, что ProcessFunc.nsh пока несовместим с NSIS 3. »
подправил под NSIS 3.XX, также работает и в предыдущих версиях. тестируйте...
http://yadi.sk/d/p-Uquod_821WI (http://yadi.sk/d/cRkxLuB0CoNuR)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.