Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
28-05-2011, 16:24
wolkow70 как вариант, если чебокс удаления отмечен, то остальные чебоксы становятся не отмеченными и недоступными для отметки, если чебокс удаления не отмечен, то все чебоксы становятся для отметок доступные.
!include "Sections.nsh"
!include "logiclib.nsh"
;--------------------------------
Name "One Section"
OutFile "one-section.exe"
RequestExecutionLevel user
Page components
Section /o "del" d1
SectionEnd
Section "Option 1" o1
SectionEnd
Section "Option 2" o2
SectionEnd
Section "Option 3" o3
SectionEnd
Section "Option 4" o4
SectionEnd
Section "Option 5" o5
SectionEnd
;--------------------------------
Function .onSelChange
${If} ${SectionIsSelected} ${d1} ;если отмечена секция del
!insertmacro UnselectSection ${o1}
!insertmacro UnselectSection ${o2}
!insertmacro UnselectSection ${o3}
!insertmacro UnselectSection ${o4}
!insertmacro UnselectSection ${o5}
${EndIf}
FunctionEnd
ненавижу возиться с отметками в секциях... решаю такие задачи через свои нарисованные странички
wolkow70
28-05-2011, 16:42
Пока сделал так, но для двух секций:
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Cleaning}
!insertmacro RadioButton ${Install}
!insertmacro EndRadioButtons
FunctionEnd
Попробую По вашему варианту...
wolkow70, как такой вариант (только когда отмечена секция "Удаление", другие секции нельзя отметить, нужно снять сперва галку на удаление)
Function .onSelChange
SectionGetFlags ${d1} $0
StrCmp $0 "1" 0 noUncheckAll
SectionSetFlags ${o1} 0
SectionSetFlags ${o2} 0
SectionSetFlags ${o3} 0
SectionSetFlags ${o4} 0
SectionSetFlags ${o5} 0
noUncheckAll:
SectionGetFlags ${o1} $0
StrCmp $0 "1" 0 +2
SectionSetFlags ${d1} 0
SectionGetFlags ${o2} $0
StrCmp $0 "1" 0 +2
SectionSetFlags ${d1} 0
SectionGetFlags ${o3} $0
StrCmp $0 "1" 0 +2
SectionSetFlags ${d1} 0
SectionGetFlags ${o4} $0
StrCmp $0 "1" 0 +2
SectionSetFlags ${d1} 0
SectionGetFlags ${o5} $0
StrCmp $0 "1" 0 +2
SectionSetFlags ${d1} 0
FunctionEnd
kotkovets
29-05-2011, 19:42
Для участников форума предоставляю плагин для работы с установочными пакетами msi.
Что умеет сей плагин,предназначенный для ANSI версии компилятора NSIS.
и х86/x64 Windows NT системах:
1.По указанному пути к продукту msi извлекать все значения из таблицы Prorerty
***********************************************************************************
Getmsi::GetProperty "[путь к msi файлу]" "[параметр]"
Pop $var
возвращает в $var:
$var = значение указанного параметра
$var = none - такого параметра нету или параметр задан не верно, либо такое значение параметра
$var = error - ошибка, неверный путь или пакет msi открыт др. программой и т.д
***Параметры пишем - строго соблюдая регистр букв!***
--------------------------------------------------------------------
- Getmsi::GetProperty "[путь к msi файлу]" "ProductCode" -
- Pop $var - извлекает из msi файла в переменную $var код продукта -
--------------------------------------------------------------------
- Getmsi::GetProperty "[путь к msi файлу]" "ProductName" -
- Pop $var - извлекает из msi файла в переменную $var имя продукта -
--------------------------------------------------------------------
***********************************************************************************
2. По коду продукта определять установлен ли продукт в ОС.
***********************************************************************************
Getmsi::GetInstall "[код продукта]"
Pop $var
возвращает в $var:
$var = 0 - этот продукт установлен
$var = 1 - этот продукт не установлен
$var = error - ошибка в коде продукта
***********************************************************************************
3. По коду продукта определять имя продукта.
***********************************************************************************
Getmsi::GetProductName "[код продукта]"
Pop $var
возвращает в $var:
$var = имя продукта
$var = none - имя продукта не определено или не задано имя
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************
3. По коду продукта определять версию продукта.
***********************************************************************************
Getmsi::GetVersionString "[код продукта]"
Pop $var
возвращает в $var:
$var = версия продукта
$var = none - версия продукта не определено или не задана
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************
4. По коду продукта определять путь к установленному продукту msi.
***********************************************************************************
Getmsi::GetLocalPackage "[код продукта]"
Pop $var
возвращает в $var:
$var = путь к продукту
$var = none - путь к продукту не определилось и т.д
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************
5. По коду продукта определять дату установки продукта msi.
***********************************************************************************
Getmsi::GetInstallDate "[код продукта]"
Pop $var
возвращает в $var:
$var = дата - фомат даты ГодМесяцЧисло, т.е к примеру 20110529 = 29.05.2011
$var = none - дата не определилась и т.д
$var = error - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************
Просьба, для тех кто не понял для чего этот плагин, не задавать глупых вопросов и не пользоваться этим плагином.
Демонстрационный пример и плагин во вложении.
Для участников форума предоставляю плагин для работы с установочными пакетами msi. »
kotkovets, для справочника не забудьте сделать приличное описание ;)
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно, нужно ли для его работы дополнительное ПО типа ".NET Framework", либо библиотеки
hb860, в шапку
kotkovets
29-05-2011, 20:03
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно »
х86/x64 Windows NT системах..
Пока не проверял WIN7 x64, дополнительных файлов типа ".NET Framework" не требует! старался писать на чистом API в студии.
Krinkels
29-05-2011, 21:49
kotkovets
Доброго времени суток.
Пока не проверял WIN7 x64 »
У меня как раз система WIN7 x64, плагин не захотел работать. Решил попробовать на установщике 7z, так вот, в начале установки выдает "Ошибка в ProductCode!"
kotkovets
29-05-2011, 22:08
Krinkels, скорее всего пакет X64, буду думать, натравите на файл msi для получения кода продукта.
ан нет, все путем, отработало на 100% на WIN XP x64, проверил на 7-Zip v9.21 (x64).msi
Getmsi::GetProperty "7-Zip v9.21 (x64).msi" "ProductCode" - файл 7-Zip v9.21 (x64).msi рядом со скриптом
ProductCode: {23170F69-40C1-2702-0921-000001000000}
Getmsi::GetInstall "{23170F69-40C1-2702-0921-000001000000}"
возвращает 0 - установлен (предварительно установил!)
Проверьте правильность кода продукта, и регистр букв очень важен! - ProductCode
Плагин только для ANSI версии NSIS, для юникода не корректно работает.
И проверьте права на win7 х64
Krinkels
29-05-2011, 22:47
kotkovets
Все работает. Моя ошибка, вернее недочет. Извиняюсь :)
wolkow70
30-05-2011, 07:29
Ребята, опять заблудился.
Делаю сборку Opera.
Такие секции:
Function .onInit
StrCpy $SysDrive $WINDIR 2
StrCpy $1 ${Sec03}
FunctionEnd
Section "Многопользовательская установка" Sec03
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\operaprefs_default.ini" "System" "Multi User" "1"
SectionEnd
;
Section /o "Однопользовательская установка" Sec04
SetOutPath "$INSTDIR"
WriteINIStr "$INSTDIR\operaprefs_default.ini" "System" "Multi User" "0"
SectionEnd
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${Sec03}
!insertmacro RadioButton ${Sec04}
!insertmacro EndRadioButtons
FunctionEnd
Кнопки 3 и 4 переключаются, но только не с первого раза. В первый клик кнопка 3 не выключается. Получаются обе секции включенными...
kotkovets
30-05-2011, 09:48
wolkow70,
функцию .onInit переместите в скрипте - пропишите после всех секций, для корректного определения индетификаторов секций, вас же компилятор просит же... :)
для NSIS последовательность действий очень важна!
wolkow70
30-05-2011, 10:31
Сия Ваша рекомендация не помогла.
Function .onSelChange
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${ID_03}
!insertmacro RadioButton ${ID_04}
!insertmacro EndRadioButtons
!insertmacro StartRadioButtons $2
!insertmacro RadioButton ${ID_14}
!insertmacro RadioButton ${ID_15}
!insertmacro EndRadioButtons
FunctionEnd
;(ПОСЛЕ ВСЕ СЕКЦИЙ)
Function .onInit
StrCpy $SysDrive $WINDIR 2
StrCpy $1 ${ID_3}
StrCpy $2 ${ID_14}
FunctionEnd
Кнопки 14,15 вроде работают, а 3,4 как попало.
http://s013.radikal.ru/i323/1105/23/02a52b6d3be4.png
Иеще почему-то первую секцию цепляют, хотя она вообще не при чем...
Разобрался, мой косяк.
Перепутал в идентификаторах секций 03 и 3 , 04 и 4
2 вопроса:
1. необходимо в PHP-файл добавить строки. Нашел следующий способ:
Section
ClearErrors
FileOpen $0 $INSTDIR\config.php a
IfErrors done
FileWrite $0 "$$CFG->dbtype = '$DBtype'"
FileClose $0
done:
SectionEnd
Но в данном случае строки добавляются в начало файла сплошняком. Можно как то заставить его добавлять строки в конец файла, но не за пределами закрытия php-скрипта, т. е. перед "?>" ?
2. как добавить между строками разрыв (Enter)?
Спасибо!
kotkovets
01-06-2011, 17:03
DruOleg, Вам уже не мало примеров приводили на макросе LineFind
В справке по индексу LineFind - читайте и изучайте
добавлять строки в конец файла, но не за пределами закрытия php-скрипта, т. е. перед "?>" ? »
Пример все тот же на LineFind перед "?>" запишет nsis
Function Replace
${If} $R9 == "?>"
${OrIf} $R9 == "?>$\r$\n"
${OrIf} $R9 == "?>$\r"
${OrIf} $R9 == "?>$\n"
StrCpy $R9 "nsis$\r$\n?>$\r$\n"
;------
;------
;------
${EndIf}
Push $0
FunctionEnd
добавлять строки в конец файла »
;---
FileSeek $0 0 End
FileWrite $0 "$\r$\n$$CFG->dbtype = '$$DBtype'$\n$\r"
как добавить между строками разрыв (Enter)? »
$\n - переместить каретку на новую строку
$\r - переместить каретку на начало строки
$\n$\r - переместить каретку на начало новой строки
$\t - знак табуляции, клавиша <Tab>
TTTLordLeo
02-06-2011, 15:56
Kotkovets, посоветуй, пожалуйста, по следующим вопросам.
Для страниц инсталлятора я использую .ini файл с настройками элементов на странице.
Я нашел решение типа, где поля создаются напрямую в функции:
${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange
Вопрос 1: как я могу присоединить функцию к событию элемента в моем случае
!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 2" "Flag" "DISABLED" - этот код почему то не делает не активным текстовое поле.
Вопрос 2: как изменить активность элемента?
У меня не получается прописать путь по умолчанию в текстовое поле кодом в функции страницы:
!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 1" "State" "C:\ProgramFolder"
Вопрос 3: как прописать текст в текстовое поле до отображения страницы?
Код скрипта в скрытом тексте
!include "Library.nsh"
!include "sections.nsh"
!include "MUI.nsh"
!include "LogicLib.nsh"
!include "OLEDB.NSH"
Name "Declarant TS"
Caption "Установка программы Declarant TS"
OutFile "InstallDeclarantTS.exe"
InstallDir "C:\GTD"
ShowInstDetails show
!define MUI_COMPONENTSPAGE_SMALLDESC
!define MUI_FINISHPAGE_NOAUTOCLOSE
Var IsInstallDB
Var ProgramFolderPath
Var DBFileFolderPath
Var ServerName
Var UserName
Var UserPathword
;Var ServerInstance
;----Страницы шагов--------
PageEx custom
PageCallBacks EnterWelcomePage LeaveWelcomePage
PageExEnd
PageEx custom
PageCallBacks EnterPathPage LeavePathPage
PageExEnd
PageEx custom
PageCallBacks EnterServerAdjustmentsPage LeaveServerAdjustmentsPage
PageExEnd
!insertmacro MUI_PAGE_INSTFILES
;---------------------------------
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
!insertmacro MUI_LANGUAGE "Russian"
Function .onInit
InitPluginsDir
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "Welcome.ini"
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ProgramPath.ini"
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ServerAdjustments.ini"
FunctionEnd
Function CheckConnection
${OLEDB}::SQL_Logon "$ServerName" "$UserName" "$UserPathword"
Pop $0
${If} $0 == 0
MessageBox MB_OK "Соединение успешно установлено!"
${Else}
MessageBox MB_OK "Попытка соединения завершилась неудачно!"
${EndIf}
FunctionEnd
Section ""
detailprint "Подключение к серверу $ServerName"
${OLEDB}::SQL_Logon "" "" "" ;"$ServerName" "$UserName" "$UserPathword"
Pop $0
;${If} $0 == 1
DetailPrint $0
Pop $0
DetailPrint $0
;${EndIf}
${OLEDB}::SQL_ExecuteScript "test.sql"
Pop $0
;${If} $0 == 1
Pop $0
DetailPrint $0
;${EndIf}
detailprint ""
detailprint "Копирование файлов"
SetOutPath $ProgramFolderPath
File Files\Antlr3.Runtime.dll
File Files\Castle.Core.dll
File Files\Castle.DynamicProxy2.dll
File Files\Castle.DynamicProxy.dll
File Files\Core.dll
File Files\Core.Impl.dll
File Files\DBConnectionParameters.xml
File Files\Declaration.Domain.Impl.dll
File Files\Declaration.Presenters.Impl.dll
File Files\Declaration.Views.dll
File Files\Declaration.Views.Impl.dll
File Files\DeclarationElectronicCopy.dll
File Files\Domain.Impl.dll
File Files\Enums.dll
File Files\Events.dll
File Files\Handbooks.Domain.dll
File Files\Handbooks.Presenters.dll
File Files\Handbooks.Presenters.Impl.dll
File Files\Handbooks.Views.dll
File Files\Handbooks.Views.Impl.dll
File Files\Iesi.Collections.dll
File Files\Injection.dll
File Files\Injection.Impl.dll
File Files\local.hibernate.cfg.xml
File Files\log4net.dll
File Files\Main.Presenters.dll
File Files\Main.Presenters.Impl.dll
File Files\Main.Views.dll
File Files\Main.Views.Impl.dll
File Files\NHibernate.ByteCode.Castle.dll
File Files\NHibernate.dll
File Files\nhibernate-configuration.xsd
File Files\nhibernate-mapping.xsd
File Files\Ninject.dll
File Files\nunit.core.dll
File Files\nunit.framework.dll
File Files\Print.dll
File Files\ProgramAdjustments.xml
File Files\remote.hibernate.cfg.xml
File Files\Repositories.dll
File Files\Repositories.Impl.dll
File Files\Screen.Presenters.dll
File Files\Screen.Presenters.Impl.dll
File Files\Screen.Views.dll
File Files\Screen.Views.Impl.dll
File Files\Services.dll
File Files\sqlceca35.dll
File Files\sqlcecompact35.dll
File Files\sqlceer35EN.dll
File Files\sqlceer35RU.dll
File Files\sqlceme35.dll
File Files\sqlceoledb35.dll
File Files\sqlceqp35.dll
File Files\sqlcese35.dll
File Files\System.Data.SqlServerCe.dll
File Files\System.Data.SqlServerCe.Entity.dll
File Files\DeclarantTS.exe
CreateShortCut "C:\Documents and Settings\All Users\Рабочий стол\DeclarantTS.lnk" "$ProgramFolderPath\DeclarantTS.exe"
SectionEnd
Function EnterWelcomePage
!insertmacro MUI_HEADER_TEXT "Приветствие" "Вас приветствует мастер установки Declarant TS"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "Welcome.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd
Function LeaveWelcomePage
!insertmacro MUI_INSTALLOPTIONS_READ $IsInstallDB "Welcome.ini" "Field 1" "State"
FunctionEnd
Function EnterPathPage
!insertmacro MUI_HEADER_TEXT "Выбор путей" "Выберите папки,куда требуется установить программу"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "ProgramPath.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 1" "State" "C:\ProgramFolder"
${if} $IsInstallDB == 0
;!insertmacro MUI_INSTALLOPTIONS_WRITE "ProgramPath.ini" "Field 2" "Flag" "DISABLED"
${endif}
FunctionEnd
Function LeavePathPage
!insertmacro MUI_INSTALLOPTIONS_READ $ProgramFolderPath "ProgramPath.ini" "Field 1" "State"
!insertmacro MUI_INSTALLOPTIONS_READ $DBFileFolderPath "ProgramPath.ini" "Field 2" "State"
FunctionEnd
Function EnterServerAdjustmentsPage
${if} $IsInstallDB == 0
Abort
${endif}
!insertmacro MUI_HEADER_TEXT "Доступ к серверу" "Укажите настройки доступа к серверу MS SQL, к которой будет подсоединена база данных"
!insertmacro MUI_INSTALLOPTIONS_INITDIALOG "ServerAdjustments.ini"
!insertmacro MUI_INSTALLOPTIONS_SHOW
FunctionEnd
Function LeaveServerAdjustmentsPage
Call SaveServerAdjustments
FunctionEnd
Function SaveServerAdjustments
!insertmacro MUI_INSTALLOPTIONS_READ $ServerName "ServerAdjustments.ini" "Field 1" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $UserName "ServerAdjustments.ini" "Field 2" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $UserPathword "ServerAdjustments.ini" "Field 3" "Text"
!insertmacro MUI_INSTALLOPTIONS_READ $0 "ServerAdjustments.ini" "Field 4" "Text"
${if} $0 <> ""
StrCpy $ServerName "$ServerName\$0"
${endif}
FunctionEnd
kotkovets
02-06-2011, 16:20
Я нашел решение типа, где поля создаются напрямую в функции:
${NSD_CreateText} 0 20u 100% 15u "Здесь можно печатать..."
Pop $Text
${NSD_OnChange} $Text fnTextChange »
Этот код для nsDialogs -> MUI2.nsh
Для страниц инсталлятора я использую .ini файл с настройками элементов на странице. »
Этот код для InstallOptions.dll -> MUI.nsh - почти не использую, так что пишите на MUI2, тогда подскажу... :dont-know
TTTLordLeo
02-06-2011, 19:50
в MUI2 определение элементов и их положение возможно только способом указания кода их создания в функция скрипта?
Или есть способ накидать элементы в визуальном дизайнере? Для MUI я использовал nisedit
kotkovets
02-06-2011, 21:42
в MUI2 определение элементов и их положение возможно только способом указания кода их создания в функция скрипта? »
конечно! никаких ini - чистый апи, работает все прекрасно - дело в тренировке и изучением толмутов.
Тем более посмотрите предыдущие странички темы этак 20 - 30 страниц - я много приводил примеров создания страничек на MUI2
есть способ накидать элементы в визуальном дизайнере? »
есть, но для юникодной версии NSIS (ссылка в шапке), но правда далеко от идеала. После 5 минут общения с дизайнером пропала охота пользоваться... :o http://coolsoft.altervista.org/en/nsisdialogdesigner
Парень из Словакии (под ником Slappy) создал плагин для "HM NIS Edit", позволяющий создавать дизайн окон инсталлятора NSIS как в InnoSetup. Назвал он свое творение "Graphical Installer (http://unsigned-softworks.sk/en/sgi.html) " и распространяет за деньги. Ориентирование плагина - создание красочных инсталляторов для игрушек. Кто-нибудь уже испытывал это чудо?
Он пишет, что этого результата можно добиться и без его дополнения. Я хотел спросить здесь у опытных NSIS-ишников (я только начал знакомиться с этим установщиком) - это действительно возможно? Просто дайте мне направление, на что обратить внимание (какие плагины или модули использовать), а я уже буду дальше сам разбираться. Как говорится, зачем платить.
Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC