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