PDA

Показать полную графическую версию : .: 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

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 происходит поиск этих самых хостов и определение секций. И вот мне надо сделать чтобы при определении секций ещё учитывался и выбор версии плагина.

Edzan
31-07-2015, 13:47
Можно ли вот этот (http://forum.oszone.net/post-1217528-97.html) как нибудь организовать в NSIS?

K.A.V.
31-07-2015, 13:52
И всё вроде как работает, кроме того что если жмёшь 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.
Что можно сделать?

MKN
01-08-2015, 11:51
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. Спасибо =)

K.A.V.
03-08-2015, 10:53
как прописать что бы инсталлятор определял версию операционки 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, но, блин...

K.A.V.
05-08-2015, 21:04
Хорошо, что есть 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-й версии: »
как всегда, РОВНОМ НИЧЁ НЕ СДЕЛАЛИ ))

K.A.V.
06-08-2015, 14:13
Можно, накидал макрос по быстрому: »
А я любитель стандартных команд :)


!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. Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна. Возможно ли?

K.A.V.
09-08-2015, 09:47
Есть четыре чекбокса, нужно сделать так- если ни один из них не отмечен, то кнопка 'далее' не активна, если хоть один отмечен, то соответственно- активна »
В этой теме уже миллион примеров, воспользуйтесь поиском по теме с именами команд 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