Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Limonica
23-10-2013, 01:37
Для убидительности проверил и на SP3 (Windows XP Home Edition)
http://dropi.ru/qMy.jpg
Все образы с MSDN. Баг реально есть и именно на Home Edition.
ссылка на оригинальные образы http://yadi.sk/d/OOa1SUsk7oKs0
Ещё раз об определении архитектуры процессора. Был предложен плагин, но можно и так (когда то уже было...) :
OutFile "PROCESSOR_ARCHITECTURE.exe"
; Функция GetNativeSystemInfo получает информацию о текщей системе приложению, которое запущено под WOW64.
; Если функция вызывается из 64-битного приложения, она эквивалентна функции GetSystemInfo.
Section
;System::Alloc 32
System::Alloc 36
Pop $0
System::Call "Kernel32::GetNativeSystemInfo(i) v (r0)"
System::Call "*$0(&i2 .r1)"
System::Free $0
StrCmp $1 0 0 +2
MessageBox MB_OK "PROCESSOR_ARCHITECTURE : INTEL "
StrCmp $1 9 0 +2
MessageBox MB_OK "PROCESSOR_ARCHITECTURE : AMD64"
StrCmp $1 6 0 +2
MessageBox MB_OK "PROCESSOR_ARCHITECTURE : IA64 "
StrCmp $1 0xffff 0 +2
MessageBox MB_OK "PROCESSOR_ARCHITECTURE : UNKNOWN "
SectionEnd
Limonica
23-10-2013, 23:13
kotkovets, когда ожидать фикс?
kotkovets
24-10-2013, 00:54
Баг реально есть и именно на Home Edition »
а именно в OSVERSIONINFOEX (http://msdn.microsoft.com/en-us/library/windows/desktop/ms724833(v=vs.85).aspx) :unsure:
неправильно возвращается значение, возвращаются в стек два значения: Professional и Home Edition с учетом этого факта
подправил winver2.nsh (http://yadi.sk/d/zSPySGWfCkC4m)
p.s
исправлена работа в юникодной версии NSIS
alexfinik
24-10-2013, 01:21
Друзья, заколебался:((( Не понимаю что делать:((
Вот бесполезный код, собранный специально, чтобы посмотреть в каком порядке идет обработка кода. Мне нужно, чтобы при наличии окон в коде, у меня он обрабатывался последовательно. Т.е. сначала цикл 1, потом вложенный в него цикл 2, потом уже переходил к циклу 3 в следующей функции, у которой роль обрабатывать заданное в 1 и 2 цикле. В первом и втором цикле задаются массивы.
Помогите, пожалуйста, или направьте на нужную литературу, да хоть на английском. Может пойму...
!include nsDialogs.nsh
!include LogicLib.nsh
Name "nsDialogs Example"
OutFile "nsDialogs Example.exe"
XPStyle on
var Num1
var NumCash
var Dialog
var Label1
var Label2
Page custom test0 test1
Function test0
MessageBox MB_OK "До цикла"
${ForEach} $R6 0 1 + 1
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 33u "окно цикла 1 $\n R6=$R6"
Pop $Label1
MessageBox MB_OK "Цикл1 $R6"
StrCpy $Num1 $NumCash
nsDialogs::Show
${ForEach} $R5 0 1 + 1
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 33u "окно цикла 2 $\n R5=$R5"
Pop $Label2
MessageBox MB_OK "Цикл2 $R5"
nsDialogs::Show
${Next}
${Next}
FunctionEnd
Function test1
${ForEach} $R7 0 1 + 1
MessageBox MB_OK "Цикл3 $R7"
${Next}
FunctionEnd
Section
SectionEnd
kotkovets
24-10-2013, 01:45
Может пойму... »
1. Зачем создавать множественный диалог nsDialogs::Create 1018 достаточно один раз создать диалог
2. В созданном диалоге разрушать, скрывать или создавать в цикле дочерние элементы диалога..
3. Функция test1 выполняется при закрытии (выполнении) функции test0
Limonica
24-10-2013, 02:05
kotkovets, огромное человеческое спасибо!
Разнообразные параметры ОС (версия, Build, SP и пр. )можно определить и с помощью WMI хедера.
Например :
;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"
Section
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
; Processor Type
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem BuildType callback_Function
; имя компьютера
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSName callback_Function
; зарегистрированный пользователь операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem RegisteredUser callback_Function
; идентификатор языка, используемого операционной системой
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Locale callback_Function
; OSLanguage
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSLanguage callback_Function
; тип операционной системы:
; 16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSType callback_Function
SectionEnd
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
FunctionEnd
Но есть такой вопрос - как распределить полученные данные раздельно по разным переменным ?
Но есть такой вопрос - как распределить полученные данные раздельно по разным переменным ? »
Элементарно ;)
Var WMI_Caption
Var WMI_Version
Var WMI_CSDVersion
Var WMI_ServicePackMajorVersion
Var WMI_ServicePackMinorVersion
Var WMI_BuildType
Var WMI_CSName
Var WMI_RegisteredUser
Var WMI_Locale
Var WMI_OSLanguage
Var WMI_OSType
Var WMI_PushVar
;http://nsis.sourceforge.net/WMI_header
OutFile "OperatingSystemInfo.exe"
!include MUI2.nsh
!include WMI.nsh
!include LogicLib.nsh
!insertmacro MUI_LANGUAGE "English"
Section
; короткое описание версии операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Caption callback_Function
StrCpy $WMI_Caption $WMI_PushVar
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Version callback_Function
StrCpy $WMI_Version $WMI_PushVar
; последний установленный сервис-пак (строка); если никакой сервис-пак не установлен, пустая строка.
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSDVersion callback_Function
StrCpy $WMI_CSDVersion $WMI_PushVar
; версия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMajorVersion callback_Function
StrCpy $WMI_ServicePackMajorVersion $WMI_PushVar
; подверсия сервис-пака
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem ServicePackMinorVersion callback_Function
StrCpy $WMI_ServicePackMinorVersion $WMI_PushVar
; Processor Type
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem BuildType callback_Function
StrCpy $WMI_BuildType $WMI_PushVar
; имя компьютера
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem CSName callback_Function
StrCpy $WMI_CSName $WMI_PushVar
; зарегистрированный пользователь операционной системы
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem RegisteredUser callback_Function
StrCpy $WMI_RegisteredUser $WMI_PushVar
; идентификатор языка, используемого операционной системой
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem Locale callback_Function
StrCpy $WMI_Locale $WMI_PushVar
; OSLanguage
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSLanguage callback_Function
StrCpy $WMI_OSLanguage $WMI_PushVar
; тип операционной системы:
; 16 - WIN95, 17 - WIN98, 18 - WINNT, 19 - WINCE
${WMIGetInfo} root\CIMV2 Win32_OperatingSystem OSType callback_Function
StrCpy $WMI_OSType $WMI_PushVar
###################################################
FileOpen $0 "$EXEDIR\WMI.txt" w
FileWrite $0 "=== OperatingSystemInfo.exe ===$\n"
FileWrite $0 "$\n$$WMI_Caption = $WMI_Caption"
FileWrite $0 "$\n$$WMI_Version = $WMI_Version"
FileWrite $0 "$\n$$WMI_CSDVersion = $WMI_CSDVersion"
FileWrite $0 "$\n$$WMI_ServicePackMajorVersion = $WMI_ServicePackMajorVersion"
FileWrite $0 "$\n$$WMI_ServicePackMinorVersion = $WMI_ServicePackMinorVersion"
FileWrite $0 "$\n$$WMI_BuildType = $WMI_BuildType"
FileWrite $0 "$\n$$WMI_CSName = $WMI_CSName"
FileWrite $0 "$\n$$WMI_RegisteredUser = $WMI_RegisteredUser"
FileWrite $0 "$\n$$WMI_Locale = $WMI_Locale"
FileWrite $0 "$\n$$WMI_OSLanguage = $WMI_OSLanguage"
FileWrite $0 "$\n$$WMI_OSType = $WMI_OSType"
FileClose $0
execshell open "$EXEDIR\WMI.txt"
quit
###################################################
SectionEnd
Function callback_Function
#$R0 = result number, $R1 = total results, $R2 = result name
System::Call "user32::OemToChar(t R2, t. r2)"
detailprint "$2"
StrCpy $WMI_PushVar $2
FunctionEnd
kotkovets
24-10-2013, 13:34
MKN
Разнообразные параметры ОС
(версия, Build, SP и пр. )можно
определить и с помощью WMI
в моем winver2 так и сделано...
точнее гибридно..
alexfinik
24-10-2013, 13:41
1. Зачем создавать множественный диалог nsDialogs::Create 1018 достаточно один раз создать диалог »
Это понятно. Т.е. оставляю только первый nsDialogs::Create 1018
2. В созданном диалоге разрушать, скрывать или создавать в цикле дочерние элементы диалога.. »
Как создавать - понятно. Как скрывать, спасибо за подсказку, теперь тоже нашел (http://nsis.sourceforge.net/NsDialogs_FAQ#How_to_Show.2FHide_a_control).
Вопрос, по какому действию скрывать и показывать другие? По нажатию кнопки Next? Как наиболее коротко это сделать? В голову приходят идеи создания отдельной функции, но может есть команды в одну строку?
в моем winver2 так и сделано... »
Хедер твой замечательный ! Это я выложил для разнообразия и привлечения интереса к WMI :)
Но что мне не нравится в WMI - подтормаживает... Пока всё определит... Может это издержки хедера ? И может можно как то ускорить его работу ?
kotkovets
24-10-2013, 14:19
мне не нравится в WMI - подтормаживает... »
именно оно подтормаживает.. только один раз..
апи неверно работает в win8 - поэтому вынужден на WMI перейти
---
По нажатию кнопки Next? Как наиболее коротко это сделать? »
самый лучший способ это делать следующие последовательные кастомные странички...
т.е если нужно по условиям предыдущей странички не показывать следующую..
что то, можно так объявить:
Page custom test0 test1
Page custom test2 test3
Page custom test4 test5
что то мне подсказывает - здесь циклы -> тупик..
alexfinik
24-10-2013, 14:56
что то мне подсказывает - здесь циклы -> тупик.. »
Ну спасибо, значит не пойду по тупиковому пути. Но наверняка кто-то делал уже что-то подобное:
1. На странице "Первая страница" задаю количество страниц с название "Вторые страницы" в поле. Например 4.
2. Далее возникают по очереди мои четыре страницы. На каждой из них задаю количество страниц "Третьи страницы" Допустим задам во всех окнах по 1,2,3,4 "третьих страниц", соответственно.
3. В конце одна 4-я страница
4. Ну соответственно у меня будет такая последовательность возникновения страниц на экране
1,2,3, 2,3,3, 2,3,3,3, 2,3,3,3,3, 4
На всех страницах вводится информация, которая дальше формирует ini и bat файлы.
Укажите, куда копать, пожалуйста. Потому что вот с вложенным фором у меня проблемы возникли... Ну тут что-то типа массива второй степени получается, то бишь матрицы. Узнал уже кучу ненужной для дела информации нового, пока искал ответ.
alexfinik, т.е. вам нужно реализовать что...если я правильно понял:
Конструкцию, при которой пользователь сам решит, сколько страниц показывать (странички будут с одинаковым содержимым уже известным вам или как?) и далее, "дублирующее" действие, на следующих страничках, пользователь опять же сам укажет количество нужных для показа страничек?
хм, я бы сделал это всё управлением переменных, т.е. к примеру:
1. В одну переменную кидаем количество нужных страничек - 4
Переходим ко второму диалогу, где читаем значение этой переменной и понимаем, что будем показывать 4 раза один (либо в теории с помощью функций менять содержимое элементов в зависимости от нумерации странички)
2. Когда "вторая" страничка будет подходить к концу показа (пользователь сделал там всё, что было необходимо) в конце функции после команды nsDialogs::Show мы плюсуем +1 к значению переменной (создаём ещё одну переменную), в которой мы указывали общее количество страничек, сравниваем значения и, если нам ещё нужно показывать странички (значение меньше 4), то перепрыгиваем меткой в начало функции (перед командой nsDialogs::Create), что поможет нам инициализировать создание второй странички в пределах одной функции, если же значение 4 (все необходимые странички были показаны), то завершаем функцию и идём дальше
В теории, таким способом можно создать неограниченное количество страничек, вроде бы, решение вашей проблемы.
Это просто набросок реализации, я сам понял, что написал, потому что в своё время много заморачивался со страничками на InstallOptions, а уловили ли вы мою идею, я не знаю :biggrin:
В любом случае, пишите больше подробностей, если что - поможем
icq99999999
24-10-2013, 17:45
определяю значение ,консервирую в переменную $1
ReadINIStr $1 "$EXEDIR\mod.ini" "Setting" "(I)D"
после определения использую $1
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"$1" -aos'
например если в $1 значение $SMPROGRAMS
то в итоге будет
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"$SMPROGRAMS" -aos'
а мне нужно чтоб nsis определил $SMPROGRAMS как это он определяет по умолчанию, например C:\ProgramData\Microsoft\Windows\Start Menu\Programs\
то есть в итоге нужно
nsExec::Exec '"$INSTDIR\PLUGINSDIR\7z.exe" e $INSTDIR\mod.7z -o"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\" -aos'
возможно ли это?
alexfinik
24-10-2013, 17:49
K.A.V., кажется что-то понял:). Спасибо. Попробую повозиться с метками.
Не очень понял относительно nsDialogs::Show. Если у нас есть Page custom test0 test1 и в test0 у нас зашит этот самый nsDialogs::Show, то после этой команды он разве не переходит сразу к test1?
Upd.: Поэкспериментировал. В моем случае, если 2 функции в странице участвуют, Goto не срабатывает если переход относится к другой функции.
Кажется пока сам разбираюсь. Изврат полный, но получается...
alexfinik, держите
!include "MUI2.nsh"
!include "FileFunc.nsh"
!include "WinMessages.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"
var showagain
var button
var DialogCount
var labelCount
Page custom func1 func2
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
Name "TEST.exe"
OutFile "TEST.exe"
ShowInstDetails show
XPStyle on
Function func1
StrCpy $DialogCount -1
showDialog:
StrCpy $showagain "0"
IntOp $DialogCount $DialogCount + 1
nsDialogs::Create 1018
pop $0
GetDlgItem $0 $HWNDPARENT 1037
SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №1"
GetDlgItem $0 $HWNDPARENT 1038
SendMessage $0 ${WM_SETTEXT} 0 "STR:Мой текст строки №2"
${NSD_CreateLabel} 0 5u 100u 20u "Перезагрузок диалога: $DialogCount"
pop $labelCount
${NSD_CreateButton} 25u 27u 150u 15u "Перезагрузка диалога"
pop $button
${NSD_OnClick} $button StartDialog
nsDialogs::Show
StrCmp $showagain "1" showDialog 0
FunctionEnd
Function func2
FunctionEnd
Function StartDialog
MessageBox MB_YESNO|MB_ICONQUESTION "Показать диалог ещё раз?" idyes restart
strcpy $showagain 0
abort
restart:
strcpy $showagain 1
# Искусственно нажимаем кнопку "Далее", чтобы перезагрузить диалог
GetDlgItem $0 $HWNDPARENT 1
SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd
Section
SetAutoClose true
SectionEnd
Вопрос: для чего вам 2-ая функция в странице?
Кажется пока сам разбираюсь. Изврат полный, но получается... »
Ну...вы тему прочитайте с самого начала, какой мы тут только изврат уже не устраивали, чего только люди не желали... :biggrin:
Может, кому пригодится...
Плагин делает окно инсталлятора прозрачным. Инструкция и пример в архиве
icq99999999
25-10-2013, 00:25
почему так работает
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe"
а так нет?
RMDir /r /REBOOTOK "$SMPROGRAMS\mod"
пишу
CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O"
получаю ярлык с таким именем
Тихая.lnk"
в чём причина?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC