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

mshak
04-10-2010, 16:03
о! спасибо. надеюсь вот это http://nsis.sourceforge.net/NsisIIS_plug-in поможет.

MKN
06-10-2010, 13:18
Для определеничя установленного приложения по наличию ключа в реестре (если ключа нет - уст vc.exe , если есть - продолжается установка) делаю так, как и советовали :
ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}" ""
StrCmp $1 "" 0 Next
SetOutPath "$TEMP"
File "vc.exe"
ExecWait "$TEMP\vc.exe"
Delete "$TEMP\vc.exe"
Next:
Это ключ в реестре есть, но vc.exe всё равно запускается, не обращая на его наличие внимания... Почему ?

kotkovets
06-10-2010, 14:53
MKN
Ну вы же читаете, значение ключа в реестре, по умолчанию, а значение пустое! соответственно $1=""
ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}" ""
Вот так будет лучше:
ReadRegStr $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{837b34e3-7c30-493c-8f6a-2b0f04e2912c}" "DisplayName"
IfErrors 0 Next
....

В переменной $1 будет значение ключа DisplayName реестра, если VC установлен.
Советую вам для отладки скриптов пользоваться messagebox

mshak
06-10-2010, 14:58
Совет для тех у кого название программы слишком длинное и не умещается на странице приветствия:
по умолчанию размер метки соствляет 28u, что примерно 2 с половиной строки. Естественно если название должно выводится на трех строчках, то оно не влезает. Это решается добавление в коде константы MUI_WELCOMEPAGE_TITLE_3LINES и тогда высота метки будет составлять 38u, что вполне достаточно для вывода трех строк.
пример:

...
!define MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_PAGE_WELCOME ;страничка привествия
...


А вот что необходимо сделать пользователям у которых не вмещается и на три строки:
открываем файл C:\Program Files\NSIS\Contrib\Modern UI 2\Pages\Welcome.nsh (C:\Program Files\NSIS - папка куда установлен NSIS, у Вас может отличаться) предварительно сделав копию этого файла.
Находим 80-82 строки со следующим содержанием

!insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE
!insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_3LINES
!insertmacro MUI_UNSET MUI_WELCOMEPAGE_TEXT

и дописываем после них

!insertmacro MUI_UNSET MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT


далее ищем строки 138-142 со следующим содержанием

;Title
!ifndef MUI_WELCOMEPAGE_TITLE_3LINES
!define MUI_WELCOMEPAGE_TITLE_HEIGHT 28
!else
!define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
!endif

и заменяем их следующим кодом:

;Title ;12u - высота одной строки
!ifndef MUI_WELCOMEPAGE_TITLE_3LINES
!ifdef MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT
!define MUI_WELCOMEPAGE_TITLE_HEIGHT ${MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT}
!else
!define MUI_WELCOMEPAGE_TITLE_HEIGHT 28
!endif
!else
!define MUI_WELCOMEPAGE_TITLE_HEIGHT 38
!endif

при этом сохраняется полная совместимость со старым скриптом.

а вот пример использования если название умещается аж на пять строк:

!define MUI_WELCOMEPAGE_TITLE_CUSTOM_HEIGHT 60 ;12u - высота одной строки
!insertmacro MUI_PAGE_WELCOME ;страничка привествия


Надеюсь кому-нибудь поможет.

MKN
06-10-2010, 15:19
kotkovets,
Подскажи, если перед установкой необходима проверка наличия нескольких процессов, запущенной службы и нескольких установленных приложений (с запуском их установки в случае отсутствия), то каким образом в Function .onInit правильно организовать их последовательное выполнение ?
Поместить в скрипте друг за другом в пределах этой секции ?

И как быть в аналогичном случае с закрытием процессов, остановкой службы перед деинсталляцией ?

И почему при наличии !define BRANDING "Текст" - на страницах "брэнд" не отображается ?

kotkovets
06-10-2010, 15:57
И почему при наличии !define BRANDING "Текст" - на страницах "брэнд" не отображается ? »
В констакту BRANDING помещаем значение "Текст"
!define BRANDING "Текст" ;
BrandingText "${BRANDING}"
перед установкой необходима проверка »

Function .OnInit
;команда1
;команда2
FunctionEnd

Строки скрипта выполняются последовательно,сначала команда1, команда2 и т.д
перед деинсталляцией аналогично »
Function un.OnInit
FunctionEnd

MKN
07-10-2010, 08:57
Ну вы же читаете, значение ключа в реестре, по умолчанию, а значение пустое! »
А разве нельзя делать определение наличия только ключа ? Без "содержимого". Этого вполне достаточно.
Если ключ существует, то - результат. Если не существует - результат. (Собственно я так всегда и делал в Setup Factory)

kotkovets
07-10-2010, 10:42
А разве нельзя делать определение наличия только ключа ? Без "содержимого" »
Можно. В скрипте реализован цикл, на поиск ключа в реестре, находим ключ- продолжаем установку, не находит - устанавливаем VC и продолжаем установку.
Section
StrCpy $0 0
loop:
EnumRegKey $1 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" $0
StrCmp $1 "" Done
StrCmp $1 "{CB2F7EDD-9D1F-43C1-90FC-4F52EAE172A1}" 0 +3
StrCpy $0 1
Goto Done
IntOp $0 $0 + 1
Goto Loop
Done:
StrCmp $0 1 Next
;здесь пишем код если VC не установлен
Next:
SectionEnd

MKN
07-10-2010, 15:03
kotkovets,
Возможны ли в NSIS действия с элементами окон (как в AutuIT) ? Или может есть какие либо хитрости для такой реализации ?

kotkovets
07-10-2010, 15:32
Возможны ли в NSIS действия с элементами окон (как в AutuIT) ? »
Конкретно, что ты имеешь в виду?
поковыряй WinMessages.nsh и команды FindWindow , SendMessage и т.д
Вплотную этим не занимался пока... :)
Закрытие всех окон IE (http://nsis.narod.ru/examples/closing_all_internet_explorer_windows.html)

MKN
07-10-2010, 17:42
Конкретно, что ты имеешь в виду? »
Фокус и переходы по контролам, нажатие кнопок, копирование-вставка в разные поля и т.п.

Вопрос: как сделать неактивной или совсем убрать кнопку "Show Details" при инсталляции ?
И возможно ли вообще убрать неактивные кнопки "Back" и "Cancel" на финишных страницах ?

mshak
07-10-2010, 18:01
возможно.... вот тебе функция которая блокирует кнопку назад (например может пригодиться на кастомных страницах)...
Function DisableBackButton
GetDlgItem $R1 $HWNDPARENT 3
; FindWindow $R1 "Button" "< &Назад" $HWNDPARENT
EnableWindow $R1 0
FunctionEnd

EnableWindow можно потом заменить на что-нибудь "посущественнее"... ведь хендл кнопки то у нас есть

======
а вот еще одна интересная функция.. может кому нибудь и пригодится.. не знаю выкладывали ли ее здесь ранее..

Function RelGotoPage ; Функция для произвольного перехода по страницам
; Вызывать след образом:
; StrCpy $R9 X ; где Х - относительный номер страницы (например: -1 переход на одну назад, 1 - на одну вперед)
; Call RelGotoPage
IntCmp $R9 0 0 Move Move
StrCmp $R9 "X" 0 Move
StrCpy $R9 "120"
Move:
SendMessage $HWNDPARENT "0x408" "$R9" ""
FunctionEnd

kotkovets
07-10-2010, 18:46
Вопрос: как сделать неактивной или совсем убрать кнопку "Show Details" при инсталляции ? »
Из справки:
ShowInstDetails
hide|show|nevershow
==========================================
ShowInstDetails hide - показываем кнопку и скрываем окно деталей
ShowInstDetails nevershow -скрываем все
ShowInstDetails show - показываем окно деталей без кнопки
==========================================
При деинсталляции:
ShowUninstDetails

MKN
08-10-2010, 10:45
при наличии в скрипте функции
!define MUI_CUSTOMFUNCTION_GUIINIT MyGUIInit
Function MyGUIInit
и т.д. как в справке
раскрашивается почему то текст страницы выбора компонентов, а не страницы приветсвия, как было задумано...
И возможно ли изменить фон страницы приветствия (без скин-плагинов) ?

mshak
08-10-2010, 11:47
MKN, к твоему вопросу по картинке:
попробуй так:

; записываем картинки в окно установщика
!define MUI_HEADERIMAGE ; - возможность запихнуть в заголовок рисунок
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp" ; - сам рисунок в заголовке
; !define MUI_HEADERIMAGE_RIGHT ; - рисунок в заголовке будет находиться справа

MKN
08-10-2010, 11:50
mshak,
Благодарю. Но я уже разобрался и удалил свой вопрос...
У меня не было !define MUI_HEADERIMAGE
А как изменить значок в полосе шапки окна ( рядом с "Установка и т.д." ) ?

mshak
08-10-2010, 12:04
!define MUI_ICON "Install.ico" ; - иконка на файл установщика
!define MUI_UNICON "UnInstall.ico" ; - иконка на файл установщика

MKN
08-10-2010, 15:36
Подскажите пожалуйста, каким образом "отвязать" текст от правого края поля страницы приветствия
!define MUI_WELCOMEPAGE_TITLE "${PRODUCT_NAME} ${PRODUCT_VERSION}"
расположив PRODUCT_NAME и PRODUCT_VERSION по центру ?

kotkovets
08-10-2010, 15:46
И возможно ли изменить фон страницы приветствия (без скин-плагинов) ? »
Открываем файл ${NSISDIR}\Contrib\Modern UI 2\MUI2.nsh и заменяем строку
!include "Pages\Welcome.nsh" на !include "Pages\Welcome_1.nsh" сохраняем
изменения в файл MUI_2.nsh
Открываем файл ${NSISDIR}\Contrib\Modern UI 2\Pages\Welcome.nsh и заменяем все константы ${MUI_BGCOLOR} на 0xFFFF80 (здесь цвет желтый) и сохраняем изменения в файл Welcome_1.nsh.
Подключаем измененый интерфейс Modern:
!include "${NSISDIR}\Contrib\Modern UI 2\MUI_2.nsh"
Все эти манипуляции нужны для того, что бы фон стартовой страницы не распространялся на все скрипты!

MKN
08-10-2010, 16:06
kotkovets,
Есть ли какой либо приём, для регистрации одной командой всех DLL, находящихся в папке ?
К примеру, есть у меня папка с полсотней библиотек, требующих регистрации. Неужели каждую в отдельности прописывать ?




© OSzone.net 2001-2012