PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

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

Попробую По вашему варианту...

K.A.V.
29-05-2011, 15:02
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 - ошибка в коде продукта, или этот продукт не установлен в ОС
***********************************************************************************
Просьба, для тех кто не понял для чего этот плагин, не задавать глупых вопросов и не пользоваться этим плагином.
Демонстрационный пример и плагин во вложении.

K.A.V.
29-05-2011, 19:56
Для участников форума предоставляю плагин для работы с установочными пакетами msi. »
kotkovets, для справочника не забудьте сделать приличное описание ;)
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно, нужно ли для его работы дополнительное ПО типа ".NET Framework", либо библиотеки

hb860, в шапку

kotkovets
29-05-2011, 20:03
И не плохо было бы указать, в каких ОС данный плагин будет работать безотказно »
х86/x64 Windows NT системах..
Пока не проверял WIN7 x64, дополнительных файлов типа ".NET Framework" не требует! старался писать на чистом API в студии.

sawe
29-05-2011, 20:59
000

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

DruOleg
01-06-2011, 15:39
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

Flix
06-06-2011, 21:32
Парень из Словакии (под ником Slappy) создал плагин для "HM NIS Edit", позволяющий создавать дизайн окон инсталлятора NSIS как в InnoSetup. Назвал он свое творение "Graphical Installer (http://unsigned-softworks.sk/en/sgi.html) " и распространяет за деньги. Ориентирование плагина - создание красочных инсталляторов для игрушек. Кто-нибудь уже испытывал это чудо?
Он пишет, что этого результата можно добиться и без его дополнения. Я хотел спросить здесь у опытных NSIS-ишников (я только начал знакомиться с этим установщиком) - это действительно возможно? Просто дайте мне направление, на что обратить внимание (какие плагины или модули использовать), а я уже буду дальше сам разбираться. Как говорится, зачем платить.

Может у кого здесь уже есть наработки в этом направлении, будет приятно с ними познакомиться и разобрать ко косточкам.




© OSzone.net 2001-2012