Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
tony1990
31-07-2015, 13:38
Накидал вот такой код:
!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "x64.nsh"
!include nsDialogs.nsh
OutFile "Sample.exe"
Var DIALOG
Var TEXT
Var Button1
Var Button2
Var Is32
Var Is64
Page custom nsDialogsPage LeaveDialog
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "English"
Function nsDialogsPage
;${If} ${RunningX64}
nsDialogs::Create 1018
Pop $DIALOG
${NSD_CreateLabel} 10u 10u 100% 29u "Выберите один из следующих типов установки:"
Pop $TEXT
${NSD_CreateRadioButton} 20u 50u 100% 12u "64-битная версия программы"
Pop $Button1
${NSD_CreateRadioButton} 20u 75u 100% 12u "32-битная версия программы"
Pop $Button2
${NSD_SetState} $Button1 1
Call Components64
${NSD_OnClick} $Button1 Components64
${NSD_OnClick} $Button2 Components32
nsDialogs::Show
;${Else}
; IntOp $Is32 0 + 1
;${EndIf}
FunctionEnd
Function Components64
IntOp $Is64 0 + 1
IntOp $Is32 0 + 0
FunctionEnd
Function Components32
IntOp $Is64 0 + 0
IntOp $Is32 0 + 1
FunctionEnd
Function LeaveDialog
Call DefineSections
FunctionEnd
Section /o "" SEC_64BIT
SectionEnd
Section /o "" SEC_32BIT
SectionEnd
Function DefineSections
IntCmp $Is64 1 is64 next
is64:
SectionSetText ${SEC_64BIT} "Секция для 64-версии"
next:
IntCmp $Is32 1 is32 next2
is32:
SectionSetText ${SEC_32BIT} "Секция для 32-версии"
next2:
FunctionEnd
И всё вроде как работает, кроме того что если жмёшь Back и выбираешь другой пункт то на странице компонентов отображаются 2 секции, а не одна.
Т.е. , кроме разных разрядностей самих приложений ещё и разные компоненты для каждой разрядности ? Никогда не встречал такого бардака... :)
Специфика программы :) Плагин для графических хостов, которые могут быть как и 32 и 64-битные. Соответственно 32-версия плагина работает с 32-битным хостами, 64 с 64. Секций может быть и мало, в зависимости сколько хостов установлено на компе.
В .onInit происходит поиск этих самых хостов и определение секций. И вот мне надо сделать чтобы при определении секций ещё учитывался и выбор версии плагина.
Можно ли вот этот (http://forum.oszone.net/post-1217528-97.html) как нибудь организовать в NSIS?
И всё вроде как работает, кроме того что если жмёшь Back и выбираешь другой пункт то на странице компонентов отображаются 2 секции, а не одна. »
Ну так вы забыли прописать в код секции, которые нужно скрывать...
Т.е. если нужно показать только для x64, то прописываем этим секциям текст и прописываем пустые имена тем секциям, которые не должны отображаться в x64
!include "MUI2.nsh"
!include "WinMessages.nsh"
!include "x64.nsh"
!include nsDialogs.nsh
OutFile "Sample.exe"
Var DIALOG
Var TEXT
Var Button1
Var Button2
Var Is32
Var Is64
Page custom nsDialogsPage LeaveDialog
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_LANGUAGE "English"
Function nsDialogsPage
;${If} ${RunningX64}
nsDialogs::Create 1018
Pop $DIALOG
${NSD_CreateLabel} 10u 10u 100% 29u "Выберите один из следующих типов установки:"
Pop $TEXT
${NSD_CreateRadioButton} 20u 50u 100% 12u "64-битная версия программы"
Pop $Button1
${NSD_CreateRadioButton} 20u 75u 100% 12u "32-битная версия программы"
Pop $Button2
${NSD_SetState} $Button1 1
Call Components64
${NSD_OnClick} $Button1 Components64
${NSD_OnClick} $Button2 Components32
nsDialogs::Show
;${Else}
; IntOp $Is32 0 + 1
;${EndIf}
FunctionEnd
Function Components64
IntOp $Is64 0 + 1
IntOp $Is32 0 + 0
FunctionEnd
Function Components32
IntOp $Is64 0 + 0
IntOp $Is32 0 + 1
FunctionEnd
Function LeaveDialog
Call DefineSections
FunctionEnd
Section /o "" SEC_64BIT
SectionEnd
Section /o "" SEC_32BIT
SectionEnd
Function DefineSections
IntCmp $Is64 1 is64 next
is64:
SectionSetText ${SEC_64BIT} "Секция для 64-версии"
SectionSetText ${SEC_32BIT} ""
next:
IntCmp $Is32 1 is32 next2
is32:
SectionSetText ${SEC_64BIT} ""
SectionSetText ${SEC_32BIT} "Секция для 32-версии"
next2:
FunctionEnd
Можно ли вот этот как нибудь организовать в NSIS? »
Можно, если прочитаете наш справочник и описание команды GetDrives для начала, ну а определить, на каком диске стоит система - не сложно, есть переменная папки Windows, по ней и определите...
Kopejkin
31-07-2015, 19:13
Вопрос по примеру из Cправочника по NSIS.
Работа со строками.
Замена строки в текстовом файле.
Имеются ли какие-либо ограничения по кодировке обрабатываемых текстовых файлов?
Мне нужно было заменить значение Lang=9 на Lang=22 в файле 01.ini. И ничего у меня не вышло. При просмотре того, что же, все-таки, выводится в переменную $R9, увидел следующее: Текст обрабатывался посимвольно.
http://savepic.su/5932860.png
Напротив, другой файл (02.ini) обрабатывался правильно - построчно.
http://savepic.ru/7671136.png
Единственное отличие файлов, которое я нашел - различная кодировка. 01.ini - USC2 Little Endian, 02.ini - ANSI.
Что можно сделать?
Kopejkin,
Попробуй NewTextreplace плагин. Он и читает, и ищет и делает многое другое, в том числе и в юникодных файлах.
Kopejkin
01-08-2015, 20:26
Попробуй NewTextreplace... »
Спасибо, хороший плагин, но иногда добавляет в конец файла какой-то мусор.
tony1990
02-08-2015, 11:01
А можно ли в кастомной странице используя nsDialogs::Create 1018 поменять надписи в хэдере на свои? Или же только nsDialogs::Create 1044 использовать?
Sharinganx3
03-08-2015, 10:48
Добрый день) подскажите если не сложно как прописать что бы инсталлятор определял версию операционки 32 или 64. Спасибо =)
как прописать что бы инсталлятор определял версию операционки 32 или 64 »
В начале кода:
!include "x64.nsh"
Далее в коде использовать:
${If} ${RunningX64}
MessageBox MB_OK "Система x64"
${Else}
MessageBox MB_OK "Система x32"
${EndIf}
tony1990
03-08-2015, 11:53
Добрый день) подскажите если не сложно как прописать что бы инсталлятор определял версию операционки 32 или 64. Спасибо
!include "x64.nsh"
...
${If} ${RunningX64}
код если система 64
${Else}
код если система 32
${EndIf}
Begin2Fly
05-08-2015, 20:28
Кто уже успел полюбить Windows 10?
Берём из справочника команду ${GetFileVersion}, либо GetDLLVersion, делаем что-то вроде:
GetDLLVersion "$SYSDIR\kernel32.dll" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $0 "$R2.$R3.$R4.$R5"
StrCpy $OS "$0" 4
MessageBox MB_OK|MB_TOPMOST|MB_USERICON "$0"
В предрелизных версиях было нормально: 10.0.билд.ххх
В RTM что-то страшное:
1. В свойствах файла (http://i6.5cm.ru/i/I9kx.png) положенная 10.0.10240.16384
2. Total Commander показывает (http://i6.5cm.ru/i/qkK0.png) 6.2.10240.16384
3. Результат вышеуказанной команды выдаёт 6.3.10240.16384
4. Resource Hacker думает следующее:
1 VERSIONINFO
FILEVERSION 10,0,10240,16384
PRODUCTVERSION 10,0,10240,16384
FILEOS 0x40004
FILETYPE 0x2
{
BLOCK "StringFileInfo"
{
BLOCK "040904B0"
{
VALUE "CompanyName", "Microsoft Corporation"
VALUE "FileDescription", "Windows NT BASE API Client DLL"
VALUE "FileVersion", "10.0.10240.16384 (th1.150709-1700)"
VALUE "InternalName", "kernel32"
VALUE "LegalCopyright", "© Microsoft Corporation. All rights reserved."
VALUE "OriginalFilename", "kernel32"
VALUE "ProductName", "Microsoft® Windows® Operating System"
VALUE "ProductVersion", "10.0.10240.16384"
}
}
BLOCK "VarFileInfo"
{
VALUE "Translation", 0x0409 0x04B0
}
}
Хорошо, что есть WinVer2, но, блин...
Хорошо, что есть WinVer2, но, блин... »
А зачем по файлам определять версию системы? Есть же средства проверенные, пользуйтесь ими
По вопросу - перед проверкой версии файла скопируйте его в другую директорию, например в $TEMP, видимо, там что-то намудрили разрабы, поэтому и такой результат выполнения команды...
Кто уже успел полюбить Windows 10? »
Не решусь ставить десятку основной системой до ближайших пакетов обновлений, к тому же, ничего существенного в систему добавлено не было (лично для меня, в плане удобности работы), из-за чего бы мне так понадобилось устанавливать эту ось, для меня в ней больше минусов, чем плюсов на данный момент, поэтому...пока люблю Windows 7 :)
Begin2Fly
06-08-2015, 09:39
А зачем по файлам определять версию системы? »
Суть не в определении версии системы, а в том, что работает оно не так, как должно.
Появилась вторая бетка 3-й версии:
F.1 3.0 Beta 2
Released on August 4th, 2015
F.1.1 Changelog
F.1.1.1 Major Changes
• Preliminary Windows 10 support
F.1.1.2 Minor Changes
• Added !appendfile /RawNL switch
• Added PESubsysVer attribute
• Exec[Wait] sets the CREATE_DEFAULT_ERROR_MODE flag when creating a process
• Fixed 4+ TiB freespace calculation bug (bug #1115)
• Fixed CreateShortcut /NoWorkingDir parsing bug (bug #1110)
• Fixed minor issues in the Pascal NSIS plug-in SDK and removed the extrap global variable
• nsDialogs and InstallOptions now use the system link color
F.1.1.3 Build System
• Linux stdcall warning fix (patch #261)
• Linux test-scripts fix (patch #260)
• Win64 fixes (including patch #258, bug #1105)
• Visual C 2012 fixes
kotkovets
06-08-2015, 12:45
Можно ли вот этот как нибудь организовать в NSIS? http://forum.oszone.net/post-1217528-97.html
Можно, накидал макрос по быстрому:
${GetGameDrive} "путь установки игры без буквы диска"
outfile test.exe
!define GetGameDrive "!insertmacro _GetGameDrive"
!macro _GetGameDrive hPatch
!include Logiclib.nsh
System::Store S
System::Call 'kernel32::GetLogicalDrives(v)i.r0'
StrCpy $1 $WINDIR 3
StrCpy $3 65
StrCpy $5 -1
${Do}
IntOp $2 $0 & 1
${If} $2 <> 0
IntFmt $2 "%c:\" $3
System::Call 'kernel32::GetDriveType(tr2)i.r4'
${If} $4 == 3
IntOp $5 $5 + 1
${IfNot} $2 == $1
StrCmp $5 1 0 +2
StrCpy $INSTDIR "$2${hPatch}"
StrCmp $5 0 0 +2
StrCpy $INSTDIR "$1${hPatch}"
${EndIf}
${EndIf}
${EndIf}
IntOp $3 $3 + 1
IntOp $0 $0 >> 1
${LoopUntil} $0 == 0
System::Store L
!macroend
Function .OnInit
${GetGameDrive} "Games\My Game"
FunctionEnd
Section
MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR"
SectionEnd
Макрос перезаписывает переменную $INSTDIR в самой первой функции установщика (пример).
Макрос определяет логические диски на компьютере и предлагает установить на первый логический диск не являющийся системным, в противном случае будет предложен системный диск.
Появилась вторая бетка 3-й версии: »
как всегда, РОВНОМ НИЧЁ НЕ СДЕЛАЛИ ))
Можно, накидал макрос по быстрому: »
А я любитель стандартных команд :)
!include "FileFunc.nsh"
!include "LogicLib.nsh"
OutFile "test.exe"
Function .onInit
StrCpy $R1 ""
StrCpy $R0 "$WINDIR" 3
${GetDrives} "HDD" "CallbackFunction"
${If} $R1 == ""
StrCpy $R1 "$R0"
${EndIf}
StrCpy $INSTDIR "$R1Games\My Game"
MessageBox MB_OK|MB_ICONINFORMATION "$INSTDIR"
quit
FunctionEnd
Function CallbackFunction
${If} $R0 != "$9"
StrCpy $R1 $9
Push "StopGetDrives"
${EndIf}
Push ""
FunctionEnd
Section
SectionEnd
как всегда, РОВНОМ НИЧЁ НЕ СДЕЛАЛИ »
Ну как же, хотя бы ради фикса бага с ключом /NoWorkingDir в CreateShortcut стоит обновиться, хотя и не критично...
kotkovets
06-08-2015, 14:56
А я любитель стандартных команд »
видимо я не любитель :)
/NoWorkingDir в CreateShortcut стоит обновиться, хотя и не критично... »
фикс без которого NSIS не NSIS :o
Vincent7
08-08-2015, 19:56
Приветствую всех. Вопрос по nsDialogs. Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна. Возможно ли?
Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна »
В этой теме уже миллион примеров, воспользуйтесь поиском по теме с именами команд nsDialogs или посмотрите примеры на офф сайте (http://nsis.sourceforge.net/NsDialogs_FAQ)
Vincent7
09-08-2015, 21:53
Вы как всегда правы.
динозавра
13-08-2015, 16:42
Всем привет. Пытаюсь сделать маленький экзешник типа замены рег файла, только с кнопкой да или да - нет. Но это не важно - все получается и сведенья добавляются в реестр. Проблема на х64 и только с веткой HKLM. Сведенья добавляются не туда. К примеру мне нужно создать [HKEY_LOCAL_MACHINE\SOFTWARE\Proba] , а у меня создается [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Proba]. Что нужно прописать, чтобы само не добавлялось Wow6432Node? Спасибо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC