Войти

Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [23] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

MaGoth
12-08-2013, 19:59
Привет народ, :)
Требуется небольшая помощь с определением Осей в инсталляшке.
Задача:
Если Ось ХР и разрешение экрана выше чем: 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
(все файлы внутри установщика) всё должно быть скрыто от глаз пользователя

MaGoth
14-08-2013, 17:40
В Справочнике по 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
Скажите пожалуйста можно ли заблокировать процесс на время установки если да то как?

MaGoth
14-08-2013, 18:27
Можно, смотри справку по Нсис, в части:
Примеры кодов:
- Работа с процессами с помощью NSIS
Ссылка на справку в шапке темы.

Хотя нет, тебе же заблочить процесс надо, а не закрыть, скорее всего нет. Хотя может кто и подскажет вариант...

K.A.V.
14-08-2013, 18:51
Из справки ув. КАВа, плагин как я понял её не определяет, а есть ли обновление для определения этой ОС?!
Ну, и любой примерчик по созданию инсталлера и определению этой версии Оси пригодился бы... »
Примеры кодов => Определение ОС
(читайте поновее способ от 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

MaGoth
14-08-2013, 19:26
K.A.V,
Ай спасибки камраден. :)

А если речь идёт об управлении сторонним процессом, то лично я вам тут не помогу (максимум, что можно сделать - убить процесс, а потом в нужное время запустить) »
Именно он и имелся ввиду.

Зы, Побег тестить примерчики... :)

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

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

Впрочем:
Весь текст по этой теме из нее.

Автор: 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
15-08-2013, 18:38
Привет народ, :)
Очередной вопрос появился и понять не могу, это мой косяк или Нсисовский...

Имеем:
- для инсталляции 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

MaGoth
17-08-2013, 19:59
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
А я все никак не мог сообразить, как привязать компонент к выбранному языку установки.

MaGoth
18-08-2013, 14:20
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