Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
alexfinik
23-07-2013, 20:00
Добрый день.... Есть хотелка обращаться к файлам в определенной папке, как к массиву.
Цель хотелки: сделать так, чтобы на экране отображались радиокнопки где можно было выбрать нужный архив и разархивировать его. Если со второй частью вроде понятки есть в голове, типа создать цикл и засунуть туда радиокнопку... а может я и неправ, но вот с первой частью - облазал всё, то ли запрос неверно составляю... в справке по locate в т.ч. на русском не нашел как выделить файл, имя которого не известно, из папки.
Спасибо! Надеюсь на ответ!
Krinkels
23-07-2013, 23:19
ИМХО это проще на Си/С++ реализовать. Получается ищем в определенной папке файлы, выводим их на экран в виде списка, далее формируем строку для распаковки и запускаем её. И я бы вместо радиокнопок сделал бы листбокс, красивее выглядит :)
Такое можно и на NSIS но это уже к гуру
kotkovets
23-07-2013, 23:34
в справке по locate в т.ч. на русском не нашел как выделить файл, имя которого не известно, из папки »
плохо читали.. архивы обычно с расширением *.zip, *.rar, *.7z
ну так и задавайте поиск по этой маске..
типа создать цикл »
в locate тоже цикл.. простая математика:
Intop $0 $0 + 1
с каждым циклом переменная $0 возрастает на единицу, следовательно в цикле мы узнаем сколько архивов найдено,
естественно с помощью плага (http://nsis.sourceforge.net/Arrays_in_NSIS) заносим в массив.
Николай М.
30-07-2013, 20:54
Может кто-нибудь сталкивался с задачкой, когда нужно заблокировать вторую (третью, четвертую и т.д) копию запущенного инсталлятора, пока не будет завершена первая?
Может кто-нибудь сталкивался с задачкой, когда нужно заблокировать вторую (третью, четвертую и т.д) копию запущенного инсталлятора, пока не будет завершена первая? »
В спарвке есть статья kotkovets, Предотвращение множественности запуска:
!include "MUI2.nsh"
!include "LogicLib.nsh"
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
OutFile "Mutex.exe"
Name "CreateMutex"
Caption "CreateMutex test"
Function .OnInit
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "$(^Name)") i .r1 ?e'
Pop $R0
${IfNot} $R0 == 0
MessageBox MB_OK|MB_ICONEXCLAMATION "Одна копия $(^Name) уже выполняется."
Abort
${EndIf}
FunctionEnd
Section
SectionEnd
Kopejkin
03-08-2013, 02:32
Второй день, как пытаюсь освоить NSIS (v2.46, Win7(x64)Ru) и, сразу же застрял, казалось бы, на ровном месте.
Не могу настроить отображение описаний компонентов, вернее одного, при деинсталяции. Не подскажете, что не так?
; Installer Sections
Section "$(PROGRUS)" SecRUS
SetOutPath "$INSTDIR"
File "1.txt"
SectionEnd
Section "$(PROGUKR)" SecUKR
SetOutPath "$INSTDIR"
File "2.txt"
SectionEnd
;--------------------------------
;Uninstaller Section
Section "Un.$(locUN)" SecUN
delete "$INSTDIR\1.txt"
delete "$INSTDIR\2.txt"
delete "$INSTDIR\label1_ru.bmp"
delete "$INSTDIR\label1_ukr.bmp"
delete "$INSTDIR\Uninstall.exe"
DeleteRegKey /ifempty HKLM "Software\UITest\Option"
SectionEnd
; Текст описания Install
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
; Текст названия Install
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія"
; Это все отображается
; Текст описания Uninstall
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы"
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми"
; Эти описания не отображаются
; Текст названия Uninstall
LangString locUN ${LANG_RUSSIAN} "Отменить локализацию"
LangString locUN ${LANG_UKRAINIAN} "Скасувати локалізацію"
; Эти описания отображаются
; Макрос, который показывает текст описания секции
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN) ; НЕ РАБОТАЕТ!!!
!insertmacro MUI_FUNCTION_DESCRIPTION_END
kotkovets
03-08-2013, 11:44
Kopejkin, нормальный скрипт в студию..
Kopejkin
03-08-2013, 12:27
В скрипте много "мусора", который используется для запоминания и пояснения (для меня), а также кусков чужих скриптов.
;--------------------------------
; Подключаем библиотеку «современного» интерфейса пользователя: Modern UI
; Команда !include позволяет включить в тело скрипта файл (у нас - MUI2.nsh,
; который трактуется компилятором так, как будто бы он является текстом скрипта.
!include "MUI2.nsh"
;--------------------------------
; Задаем степень и режим сжатия исходных файлов. Командная опция /SOLID
; указывает компилятору поместить все сжимаемые данные в один блок,
; тем самым еще больше увеличив степень сжатия файлов инсталлятора.
SetCompressor /SOLID lzma
;--------------------------------
;Задаем перечень констант
;ABCD_EFRTX – имя константы, "Xxxx" — её значение.
; Имя приложения
!define PRODUCT_NAME "UITest"
; Версия приложения
!define PRODUCT_VERSION "1.0"
; Папка, где будут храниться исходные файлы, подлежащие сжатию.
!define pkgdir "d:\package"
; Запоминаем язык установки InstallerLanguage
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\UITest\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
; Указываем отображать картинку в заголовках страниц (кроме WELCOME)
!define MUI_HEADERIMAGE ; По умолчанию исп. nsis.bmp
;Указываем, где лежит файл нужной вам картинки (если нужно)
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\win.bmp"
; Настраиваем интерфейс. Константа MUI_ABORTWARNING определяет, выдавать ли
; предупреждение при закрытии инсталятора пользователем. Типа: «Вы действительно
; хотите прервать установку ..бла бла » с кнопками «да» и «нет».
!define MUI_ABORTWARNING
; Константой MUI_ICON определяем значок инсталятора. Без константы исп. modern-install.ico:
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico"
; Константой MUI_UNICON определяем значок деинсталятора. Без констант исп. modern-uninstall.ico:
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-colorful.ico"
; Если вам вообще не нужны описания секций и компонентов, можете отключить их,
; задав пустую константу:
;!define MUI_COMPONENTSPAGE_NODESC ; Расположить её нужно в начале скрипта
; инсталлятора, но ПЕРЕД вызовом макроса MUI_PAGE_COMPONENTS.
; Или можете переместить описание секций ПОД полем выбора компонентов,
; аналогично примеру выше, но константу НАДО определить:
!define MUI_COMPONENTSPAGE_SMALLDESC
; Для отображения описания СПРАВА поля компонентов (по умолчанию) НИЧЕГО не дописывать.
;--------------------------------------------------------------------------------
; Определяем страницы инсталлятора, которые будут видны конечному пользователю.
; Макросы вызываются из MUI2.nsh.
; Станицы установки:
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(License)"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
; Страницы удаления:
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
; Указываем доступные языки инсталяции:
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
!insertmacro MUI_RESERVEFILE_LANGDLL ; что это такое????
; Предоставляем пользователю при запуске инсталятора выбрать язык установки:
; - Русский или Украинский. Язык запроса выбора - Английский.
; Это - функция инсталяции
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
;!undef MUI_ICON ; что это ???
;!define MUI_ICON "uninstall.ico" ; что это ???
FunctionEnd
;--------------------------------------------------------------------
;Указываем деинсталлятору использовать язык инсталлятора
;Это - функция деинсталяции
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
; Текст внизу окон (вместо nullsoft bla-bla
BrandingText "KOPEJKIN"
; Назначаем инсталлятору заголовок, отражающий его назначение. Используем константы.
; Команда Name задает название кнопки инсталлятора на панели задач.
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
; Команда Caption задает заголовок окна инсталятора
;Caption "Локализация ${PRODUCT_NAME} ${PRODUCT_VERSION}"
; В мультиязычном инсталляторе будем использовать модифицированный текст,
; предоставляемый языковыми файлами инсталлятора. Поэтому для команды Name
; можно использовать константы команды Caption, а её не использовать?
;--------------------------------------------------------------------
; Задаем папку установки по умолчанию. Макрос MUI_PAGE_DIRECTORY работает с системной
; переменной $INSTDIR, т.е. читает её значение перед отображением страницы
; пользователю и записывает в неё путь к папке, выбранной пользователем ПОСЛЕ
; закрытия этой страницы. Чтобы на этой странице показать пользователю путь к папке
; по умолчанию, необходимо задать начальное значение $INSTDIR специальной командой InstallDir.
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
; Можно получить путь к папке установки из реестра, если доступно
InstallDirRegKey HKCU "Software\UITest" ""
; Задаем имя файла нашего инсталлятора командой OutFile. Можно использовать
; константы, или вписать что угодно самостоятельно.
OutFile "${PRODUCT_NAME}.${PRODUCT_VERSION}.exe" ; Получится: UITest.1.0.exe
; Для новых ОС (Vista, Windows 7/8) можно запросить права пользователя ???
RequestExecutionLevel user
; Указываем режим отображения хода выполнения инсталляции (протокола).
; Наш случай: (ничего не пишем) - протокол скрыт, и появляется только при нажатии кнопки
; «Детали». Возможные значения: hide, show и nevershow. По умолчанию - hide;
; nevershow отключает и вышеупомянутую кнопку, show — показывает все.
;ShowInstDetails show
; Организация возможности выбора пользователем желаемых компонентов реализуется
; макросом страницы MUI_PAGE_COMPONENTS.
;--------------------------------
;Reserve Files
;If you are using solid compression, files that are required before
;the actual installation should be stored first in the data block,
;because this will make your installer start faster.
;--------------------------------
; Installer Sections
Section "$(PROGRUS)" SecRUS
SetOutPath "$INSTDIR"
File "1.txt"
SectionEnd
Section "$(PROGUKR)" SecUKR
SetOutPath "$INSTDIR"
File "2.txt"
SectionEnd
;Function .onSelChange
;!insertmacro StartRadioButtons $1
;!insertmacro RadioButton ${firstsec}
;!insertmacro RadioButton ${secondsec}
;!insertmacro EndRadioButtons
;FunctionEnd
; При использовании этих макросов для секций пишет, что должно быть не более 3 параметров.
; А у меня выходит 4 (Разбираться)
; Ниже: Ещё не разбирался. В таком виде файлы картинок устанавливаются! с учетом выбранного
; языка установки, но только при повторном запуске программы установки.
Section ;$(Install)
SectionIn 1
SetOutPath "$INSTDIR"
;ADD YOUR OWN FILES HERE...
;File "1.txt"
;File "2.txt"
;Store installation folder
;WriteRegStr HKLM "Software\UITest" "" $INSTDIR
; RU-EN section
ReadRegStr $R0 HKLM "Software\UITest\Option" "InstallerLanguage"
StrCmp $R0 "1049" RussianLanguage
StrCmp $R0 "1058" UkrainianLanguage
goto NotRightLanguage
RussianLanguage:
File "label1_ru.bmp"
goto NotRightLanguage
UkrainianLanguage:
File "label1_ukr.bmp"
goto NotRightLanguage
NotRightLanguage:
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd
; Ниже: Относится к секции RU-EN. Появляется сообщение с кнопкой ОК
Section "-Hide"
ReadRegStr $R0 HKLM "Software\UITest\Option" "InstallerLanguage"
StrCmp $R0 "1049" RussianLanguage
StrCmp $R0 "1058" UkrainianLanguage
goto NotRightLanguage
RussianLanguage:
MessageBox MB_OK "Установка русского рисунка"
goto NotRightLanguage
UkrainianLanguage:
MessageBox MB_OK "Установка украинского рисунка"
goto NotRightLanguage
NotRightLanguage:
SectionEnd
;--------------------------------
;Uninstall Section
Section "Un.$(locUN)" SecUN
delete "$INSTDIR\1.txt"
delete "$INSTDIR\2.txt"
delete "$INSTDIR\label1_ru.bmp"
delete "$INSTDIR\label1_ukr.bmp"
delete "$INSTDIR\Uninstall.exe"
DeleteRegKey /ifempty HKLM "Software\UITest\Option"
;RMDir "$INSTDIR"
SectionEnd
;----------------------------------------------------------------
; Файлы с текстом Лицензионного соглашения на разных языках
LicenseLangString License ${LANG_RUSSIAN} "lic_rus.txt"
LicenseLangString License ${LANG_UKRAINIAN} "lic_ukr.txt"
; Текст описания секции Install
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
; Текст названия секции Install
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія"
; Текст описания секции Uninstall
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы."
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми."
; Текст названия секции Uninstall
LangString locUN ${LANG_RUSSIAN} "Отменить локализацию"
LangString locUN ${LANG_UKRAINIAN} "Скасувати локалізацію"
; -ИСПРАВЛЕНО- Макрос, который показывает текст описания секции Install
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
; -ИСПРАВЛЕНО- Макрос, который показывает текст описания секции Uninstall
!insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END
; Ниже: Пока не знаю для чего это.
;LangString LNG_BMP1 ${LANG_UKRAINIAN} "label1_ukr.bmp"
;LangString LNG_BMP1 ${LANG_RUSSIAN} "label1_ru.bmp"
kotkovets
03-08-2013, 13:53
Kopejkin,
Для секций удаления применяется тот же макрос, но с приставкой Un
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END
!insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END
Про LangString (http://forum.oszone.net/post-1553443-903.html)
-----
p.s
Скрипт выделяется и заключается в тег: #
невозможно по-человечески прочитать...
Kopejkin
03-08-2013, 15:37
Спасибо kotkovets.
Сообщение отредактировал.
tony1990
05-08-2013, 17:26
Добрый день!
Подскажите пожалуйста как добавить свою кнопку на стандартную страницу компонентов. Добавил следующий код, но
кнопка рисуется только на первой странице.
Заранее спасибо.
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "LICENSE"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
var HostButton
Function CompShowProc
${NSD_CreateButton} 0 250 100% 12u "Текст"
Pop $HostButton
FunctionEnd
Kopejkin
06-08-2013, 16:02
Чего-то я совсем запутался...
Рискну снова задать вопрос по секциям.
Правильно ли написаны примеры подобные нижеприведенному в Справочнике по NSIS:
Section "Тестирование" TEST_SEC
SectionEnd
Section
; Не должно ли здесь и в конце вместо Section быть Function ?
SectionGetText ${TEST_SEC} $0
StrCpy $0 "$0 - $WINDIR"
SectionSetText ${TEST_SEC} $0
SectionEnd
В таком виде, все что написано между Section, не работает,
http://savepic.org/4383059.png
а если вставить (без Section) в функцию, напр. (.OnInit) - то работает.
А спросить хотел вот о чем.
Предполагается, что нижеприведенный скрипт будет выполнять пропатчивание. Закоментированный код из секции "Обновление" будет позже добавлен в существующие секции с соответствующим изменением имен файлов.
Можно ли, используя WinVer2, скрывать секции PROGRUS и PROGUKR, если установка выполняется на 64 разрядной системе и, наоборот, скрывать PROGRUS64 и PROGUKR64 при установке на 32 разрядной системе? Если можно, укажите поточнее, где или что об этом написано в справке или справочнике. А если поделитесь кодом - буду очень благодарен.
Еще интересует, почему файл деинсталлятора все равно создается, если из программы установки я выхожу, напр. из диалога выбора компонентов?
!include "WinVer2.nsh"
!include "MUI2.nsh"
!include "VPatchLib.nsh"
;!include "Logiclib.nsh"
SetCompressor /SOLID lzma
; Имя приложения
!define PRODUCT_NAME "UITest"
; Версия приложения
!define PRODUCT_VERSION "1.0"
; Папка, где будут храниться исходные файлы, подлежащие сжатию.
!define pkgdir "d:\package"
; Запоминаем язык установки InstallerLanguage
!define MUI_LANGDLL_REGISTRY_ROOT "HKLM"
!define MUI_LANGDLL_REGISTRY_KEY "Software\UITest\Option"
!define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage"
!insertmacro MUI_RESERVEFILE_LANGDLL ; ЧТО ЭТО и НУЖНО ЛИ ОНО????
!define MUI_ABORTWARNING
; Константой MUI_ICON определяем значок инсталятора. Без константы исп. modern-install.ico:
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-colorful.ico"
; Константой MUI_UNICON определяем значок деинсталятора. Без констант исп. modern-uninstall.ico:
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-colorful.ico"
!define MUI_COMPONENTSPAGE_SMALLDESC
; Станицы установки:
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "$(License)"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
;!insertmacro MUI_PAGE_FINISH
; Страницы удаления:
!insertmacro MUI_UNPAGE_WELCOME
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_COMPONENTS
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
; Указываем доступные языки инсталяции:
!insertmacro MUI_LANGUAGE "Russian"
!insertmacro MUI_LANGUAGE "Ukrainian"
Function .OnInit
; Отображаем диалог выбора языка
!insertmacro MUI_LANGDLL_DISPLAY
; Определяем разрядность системы
${WinPlatformArchitecture} $R1
MessageBox MB_ICONINFORMATION|MB_OK "WinPlatformArchitecture = $R1"
FunctionEnd
;--------------------------------------------------------------------
;Указываем деинсталятору использовать язык инсталлятора
Function un.onInit
!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
;--------------------------------------------------------------------
; Текст внизу окон (вместо nullsoft bla-bla
BrandingText "TEST"
; Назначаем инсталлятору заголовок
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
;--------------------------------------------------------------------
; Задаем папку установки по умолчанию.
InstallDir "$PROGRAMFILES64\${PRODUCT_NAME}"
; Задаем имя файла нашего инсталлятора
OutFile "${PRODUCT_NAME}.${PRODUCT_VERSION}.exe"
; Получится: UITest.1.0.exe
; Для новых ОС (Vista, Windows 7/8) можно запросить права пользователя ???
RequestExecutionLevel user
; Указываем режим отображения хода выполнения инсталляции (протокола), если нужно.
;ShowInstDetails show
;--------------------------------
;Section "Обновление"
;SetOutPath $INSTDIR
; Update the file - it will be replaced with the new version
;DetailPrint "Prepare to updating oldfile.txt using patch..."
;!insertmacro VPatchFile "patch.pat" "$INSTDIR\oldfile.txt" "$INSTDIR\temporaryfile.txt"
;SectionEnd
Section /o "$(PROGRUS)" SecRUS
SetOutPath $INSTDIR
File "1.txt"
SectionEnd
Section /o "$(PROGUKR)" SecUKR
SetOutPath $INSTDIR
File "2.txt"
SectionEnd
Section /o "$(PROGRUS64)" SecRUS64
SetOutPath $INSTDIR
File "1.64.txt"
SectionEnd
Section /o "$(PROGUKR64)" SecUKR64
SetOutPath $INSTDIR
File "2.64.txt"
SectionEnd
;--------------------------------
;Installer Functions
Function .onSelChange
; Выбор между компонентам 1 и 4
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${SecRUS}
!insertmacro RadioButton ${SecUKR}
!insertmacro RadioButton ${SecRUS64}
!insertmacro RadioButton ${SecUKR64}
!insertmacro EndRadioButtons
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
FunctionEnd
;--------------------------------
;Uninstaller Section
Section "Un.$(locUN)" SecUN
delete "$INSTDIR\1.64.txt"
delete "$INSTDIR\2.64.txt"
delete "$INSTDIR\1.txt"
delete "$INSTDIR\2.txt"
delete "$INSTDIR\Uninstall.exe"
DeleteRegKey /ifempty HKLM "Software\UITest\Option"
;RMDir "$INSTDIR"
SectionEnd
;----------------------------------------------------------------
; Файлы с текстом Лицензионного соглашения
LicenseLangString License ${LANG_RUSSIAN} "lic_rus.txt"
LicenseLangString License ${LANG_UKRAINIAN} "lic_ukr.txt"
; Текст описания секции
LangString DESC_PROGRUS ${LANG_RUSSIAN} "Русская версия программы"
LangString DESC_PROGRUS ${LANG_UKRAINIAN} "Російська версія програми"
LangString DESC_PROGUKR ${LANG_RUSSIAN} "Украинская версия программы"
LangString DESC_PROGUKR ${LANG_UKRAINIAN} "Українська версія програми"
LangString DESC_PROGRUS64 ${LANG_RUSSIAN} "Русская версия программы(x64)"
LangString DESC_PROGRUS64 ${LANG_UKRAINIAN} "Російська версія програми(x64)"
LangString DESC_PROGUKR64 ${LANG_RUSSIAN} "Украинская версия программы(x64)"
LangString DESC_PROGUKR64 ${LANG_UKRAINIAN} "Українська версія програми(x64)"
; Текст названия секции
LangString PROGRUS ${LANG_RUSSIAN} "Русская версия (x86)"
LangString PROGRUS ${LANG_UKRAINIAN} "Російська версія (x86)"
LangString PROGUKR ${LANG_RUSSIAN} "Украинская версия (x86)"
LangString PROGUKR ${LANG_UKRAINIAN} "Українська версія (x86)"
LangString PROGRUS64 ${LANG_RUSSIAN} "Русская версия (x64)"
LangString PROGRUS64 ${LANG_UKRAINIAN} "Російська версія (x64)"
LangString PROGUKR64 ${LANG_RUSSIAN} "Украинская версия (x64)"
LangString PROGUKR64 ${LANG_UKRAINIAN} "Українська версія (x64)"
; Текст описания секции деинсталяции
LangString DESC_UNIN ${LANG_RUSSIAN} "Удалить локализованную версию и восстановить английский язык программы"
LangString DESC_UNIN ${LANG_UKRAINIAN} "Видалити локалізовану версію та відновити англійську мову програми"
; Текст названия секции деинсталяции
LangString locUN ${LANG_RUSSIAN} "Удалить локализованный файл"
LangString locUN ${LANG_UKRAINIAN} "Видалити локалізований файл"
; Макрос, который показывает текст описания компонентов для Install
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS} $(DESC_PROGRUS)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR} $(DESC_PROGUKR)
!insertmacro MUI_DESCRIPTION_TEXT ${SecRUS64} $(DESC_PROGRUS64)
!insertmacro MUI_DESCRIPTION_TEXT ${SecUKR64} $(DESC_PROGUKR64)
!insertmacro MUI_FUNCTION_DESCRIPTION_END
; Макрос, который показывает текст описания компонентов для Uninstall
!insertmacro MUI_UnFUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SecUN} $(DESC_UNIN)
!insertmacro MUI_UnFUNCTION_DESCRIPTION_END
tony1990
06-08-2013, 16:25
Частично разобрался. !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" нужно ставить перед страницей которую кастомизируешь. Но... вопрос остался. При добавлении кнопки таким способом инсталлятор зависает на странице компонентов.
Предположения?
Правильно ли написаны примеры подобные нижеприведенному в Справочнике по NSIS »
Примеры написаны правильно, вопрос в другом: что вы хотите реализовать
В справочнике заключено в "секции" (именно по Setcion страничке) - это всего лишь пример исполнения команд
В таком виде, все что написано между Section, не работает, »
И не должно срабатывать, ибо...Ответил выше, секции отрабатываются поочерёдно, и "косметические" изменения (в вашем случае имя секции) вам не отобразятся, т.к. секции отрабатываются в сам момент начала процесса установки
Код:
SectionGetText ${TEST_SEC} $0
StrCpy $0 "$0 - $WINDIR"
SectionSetText ${TEST_SEC} $0
Вам нужно поместить скажем, в custom page перед показом странички компонентов, т.е. вот так:
Page Custom SectionName
!insertmacro MUI_PAGE_COMPONENTS
и добавить функцию:
Function SectionName
SectionGetText ${TEST_SEC} $0
StrCpy $0 "$0 - Мой текст"
SectionSetText ${TEST_SEC} $0
FunctionEnd
Обратите внимание на то, что данная функция будет отрабатываться каждый раз при переходе с предыдущей стрнаницы инсталлера на страничку компонентов, т.е. текст будет постоянно добавляться...Можно этого избежать, прописывая имя секции в команде назначения текста:
Function SectionName
StrCpy $0 "Имя моей секции - Добавляемый текст"
SectionSetText ${TEST_SEC} $0
FunctionEnd
Либо, можете прописывать данную команду в функцию .onInit, имя секции изменится только при запуске инсталлятора
Вообще, вам нужно было описать конкретную цель и задачи, мы бы дали вам конкретный совет и, возможно, готовый код...А гадать, что вам именно нужно, предоставляя кучу примеров, как-то неохото...
скрывать секции PROGRUS и PROGUKR, если установка выполняется на 64 разрядной системе и, наоборот, скрывать PROGRUS64 и PROGUKR64 при установке на 32 разрядной системе? Если можно, укажите поточнее, где или что об этом написано в справке или справочнике. А если поделитесь кодом - буду очень благодарен. »
В начале кода создайте переменную:
var IsWow64Process
Пропимсываем определение типа процесса
Function .onInit
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
FunctionEnd
Если $IsWow64Process = 0 - 32-bit процесс
Т.е. там же, в функции .onInit уже пляшем от значения переменной $IsWow64Process и скрываем "лишние" секции
Скрыть секцию легко - достаточно назначить пустое имя секции:
Function .onInit
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
StrCmp $IsWow64Process "1" 0 +3
call Is64Bit
goto +2
call Is32Bit
FunctionEnd
Function Is64Bit
; Скрываем секции, если процесс 64 битный
SectionSetText ${PROGRUS} ""
SectionSetText ${PROGUKR} ""
FunctionEnd
Function Is32Bit
; Скрываем секции, если процесс 32 битный
SectionSetText ${PROGRUS64} ""
SectionSetText ${PROGUKR64} ""
FunctionEnd
Кстати, не забудьте, что если у вас секции по умолчанию отмечены для установки, то скрытая секция всё равно отработает все команды (скрытие секции не снимает флаг её отметки, а всего лишь скрывает от пользователя)
Еще интересует, почему файл деинсталлятора все равно создается, если из программы установки я выхожу, напр. из диалога выбора компонентов? »
Потому что у вас команда на создание деинсталлятора прописана в функцию, которая выполняется при взаимодействии с компонентами!
Function .onSelChange
; Выбор между компонентам 1 и 4
!insertmacro StartRadioButtons $1
!insertmacro RadioButton ${SecRUS}
!insertmacro RadioButton ${SecUKR}
!insertmacro RadioButton ${SecRUS64}
!insertmacro RadioButton ${SecUKR64}
!insertmacro EndRadioButtons
;Create uninstaller
WriteUninstaller "$INSTDIR\Uninstall.exe"
FunctionEnd
Переместите данную команду в post секцию ниже всех...
Частично разобрался. !define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc" нужно ставить перед страницей которую кастомизируешь. Но... вопрос остался. При добавлении кнопки таким способом инсталлятор зависает на странице компонентов »
Предположения? »
Не умеем мы предполагать, скрипт в студию
tony1990
06-08-2013, 20:43
Ну вот скриптик упрощённый для примера. На странице приветствия кнопка рисуется, а если закомментировать/убрать строку !insertmacro MUI_PAGE_WELCOME, то на странице компонентов кнопка не отображается. Правда тут инсталлятор не зависает.
!include "MUI2.nsh"
Name "Example1"
OutFile "example1.exe"
var HostButton
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Function CompShowProc
${NSD_CreateBrowseButton} 0 0 100% 15u "Текст"
Pop $HostButton
FunctionEnd
Section "Component1"
SectionEnd
Section "Component2"
SectionEnd
Section "Component2"
SectionEnd
Kopejkin
07-08-2013, 04:05
K.A.V., большое спасибо за развернутый ответ!
...что вы хотите реализовать »
Пока я просто пытаюсь хоть что-нибудь понять.
tony1990
08-08-2013, 14:32
Почитал форум. Похоже что править стандартные страницы можно только при помощи системных функций. Ребят, киньте плиз ссылочку на документацию по системным функциям
tony1990
09-08-2013, 17:10
Нашёл решение в виде Button.dll Но возникла небольшая сложность. Кнопка работает только в нижней части экрана. А если скажем изменить координату Y на 200, то уже не работает. Нужна помощь!
!include "MUI2.nsh"
!define IDC_ABOUT 1300
!define MUI_COMPONENTSPAGE_SMALLDESC
Name "Example1"
OutFile "example1.exe"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW "CompShowProc"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"
Function CompShowProc
System::Call 'kernel32::GetModuleHandle(i0)i.r0'
System::Call 'user32::CreateWindowEx(i0,t"Button",t"Add Host",i${BS_PUSHBUTTON}|${WS_CHILD}|${WS_VISIBLE}|${WS_TABSTOP},i80,i300,i90,i25,i$HWNDPARENT,i${IDC_ABOU T},ir0,i0)i.R0'
System::Call 'kernel32::FreeLibrary(ir0)'
CreateFont $0 '$(^Font)' '$(^FontSize)'
SendMessage $R0 ${WM_SETFONT} $0 0
GetFunctionAddress $0 FuncAbout
ButtonEvent::AddEventHandler /NoUnload ${IDC_ABOUT} $0
FunctionEnd
Function FuncAbout
;0x40=MB_OK(0x0)|MB_ICONINFORMATION(0x40)
System::Call 'user32::MessageBox(i$HWNDPARENT,t"Всё отлично!",t"About",i0x40)'
FunctionEnd
Section "Component1"
SectionEnd
Section "Component2"
SectionEnd
Section "Component3"
SectionEnd
kotkovets
10-08-2013, 20:32
А если скажем
изменить координату Y на 200, то
уже не работает
перекрывается стандартными контролами странички, поэтому не видно, для начала нужно править ресурсы установщика, примеров много в архиве темы.
Kopejkin
11-08-2013, 14:54
Для патча использую плагин VPatch, который выводит в протокол свои сообщения (DetailPrint).
В сценарии примера имеется только одно из них. Можно ли как-то локализовать остальные сообщения?
; Update the file - it will be replaced with the new version
DetailPrint "Prepare to updating..."
!insertmacro VPatchFile "ws64ukr.pat" "$INSTDIR\WinSnap64.exe" "$INSTDIR\temporaryfile.exe"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC