Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
Теперь осталось эту кодировку оформить в скрипте. Вы не знаете как это сделать? »
Что сделать то? Поменять кодировку файла или записать корректно строку в файл с не ANSI кодировкой?
Если поменять кодировку файла - не знаю (и гуглить особо не ок с мобильного инета, поэтому как-нибудь сами), я вообще по теме кодировок "не бум бум"
Судя по запросу гугла на сайте NSIS есть какой-то плаг "Unicode", у меня в архиве на жд его нет (опять же, потому что темой кодировок не интересовался), поэтому не могу сказать, что это за плаг и какие в нём есть функции - возможно в нём как раз есть полезные функции
Поиском в гугле по-быстрому наткнулся на код от kotkovets (http://forum.ru-board.com/topic.cgi?forum=5&topic=0595&start=1325&limit=1&m=1), в нём есть макрос преобразования ANSI строки в UTF8, что позволяет писать корректно в файл с кодировкой UTF8 (насчет других - не в курсе)
!include "StrFunc.nsh"
${StrRep}
!define ANSIToUTF8 "!insertmacro ANSIToUTF8"
!macro ANSIToUTF8 SOURCE_STRING OUTPUT_STRING
Push `${SOURCE_STRING}`
System::Store SR2
System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,i0,i0)i.R1"
IntOp $R1 $R1 * 2
System::Alloc $R1
Pop $R0
System::Call "kernel32::MultiByteToWideChar(i0,i0,tR2,i-1,iR0,iR1)"
System::Call "kernel32::WideCharToMultiByte(i65001,i0,iR0,i-1,t.s,iR1,i0,i0)"
System::Free $R0
System::Store L
Pop `${OUTPUT_STRING}`
!macroend
OutFile "test.exe"
Section
${StrRep} $0 "$EXEDIR\acity_temp" "\" "\\"
${ANSIToUTF8} "$0" "$0"
WriteINIStr "$EXEDIR\TEST.ini" "Directories" "TempDir" "$0"
quit
SectionEnd
tony1990
26-07-2015, 15:08
Всем привет!
Возникла такая задача. В зависимости от выбора типа установки (32-бит или 64-бит) выводить в списке компонентов только нужные элементы (именно выводить, а не отмечать галочкой). Есть ли какой-нибудь флаг типа установки InstType чтобы знать какой выбран в данный момент или же тут только через кастомную страницу с радиобатонами придётся решать?
Заранее благодарен.
Есть ли какой-нибудь флаг типа установки InstType чтобы знать какой выбран в данный момент »
Если справочник не читали - рекомендую это сделать, флаг типа установки (как ни странно) хранит только то, какой тип установки выбран, прочитайте про команду GetCurInstType
В зависимости от выбора типа установки (32-бит или 64-бит) выводить в списке компонентов только нужные элементы (именно выводить, а не отмечать галочкой) »
Ну так, проще простого, ведь NSIS не отображает секции без имён - этим и нужно пользоваться
А разрядность ОСи определяется буквально парой строк
В зависимости от выбора типа установки (32-бит или 64-бит)
Пользователю ещё и тыкать нужно? Сделайте всё на автомате...
Section /o "Эта секция скрывается при 64-bit ОС" SEC_64BIT
SectionEnd
Section /o "Эта секция скрывается при 32-bit ОС" SEC_32BIT
SectionEnd
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process ; 0 = 32-bit ОС, 1 = 64-bit ОС
${If} $IsWow64Process == "1"
SectionSetText ${SEC_64BIT} "" ; Секции с пустыми именами не отображаются
${Else}
SectionSetText ${SEC_32BIT} "" ; Секции с пустыми именами не отображаются
${EndIf}
FunctionEnd
Dodakaedr
27-07-2015, 23:14
Можно такое реализовать?: надо дождаться завершения процесса, но этот процесс запускается в другом процессе. То есть использую запуск Exec '"$INSTDIR\someprogram.exe"', но эта someprogram.exe запускает OtherProg.exe. Надо дождаться завершения работы этой самой OtherProg.exe. Сразу запуск с ожиданием OtherProg.exe не катит.
kotkovets
27-07-2015, 23:19
Dodakaedr, в шапке: Работа с процессами (ProcessFunc.nsh)
P.s
Скоро выложу обновленный, адаптированный по win10 winver2.nsh
Dodakaedr
27-07-2015, 23:43
Хотел уже писать что не нашел там нужного, а потом решил еще раз посмотреть по внимательней и увидел))time - указанное время в миллисекундах, если указать константу ${INFINITE} или -1
установщик будет ждать завершения процесса.
Спасибо!
Function test
StrCpy $R0 1
loop:
${LineRead} "$EXEDIR\test.csv" "$R0" $R1
StrCmp $R1 "" exit 0
${WordFind2X} "$R1" "{" "}" "+1" $R1
StrCpy $PayloadID $R1
IntOp $R0 $R0 + 1
Goto loop
exit:
FunctionEnd
Есть примерно такой код. Подскажите, пожалуйста, как в $PayloadID поместить все перечисленные значения из текстового файла, а не одно значение поочерёдно.
Что-то сообразить не могу...
StrCpy $PayloadID "$PayloadID $R1"
Что-то сообразить не могу... »
Заработались наверное, отдохните :)
tony1990
28-07-2015, 11:29
Спасибо за GetCurInstType!
Пользователю ещё и тыкать нужно? Сделайте всё на автомате...
Задача несколько иная. Я наверно не совсем точно выразился. На 64 системе должен быть выбор установки 32-битной или 64-битной версии программы. С флагом типа установки теперь легко всё реализую.
Спасибо!
kotkovets
28-07-2015, 23:54
Адаптировал WinVer2.nsh (https://yadi.sk/d/NbcEluV3i9LAk) под Windows 10.
Добавлены значения:
Определение названия ОС:
Win10
Server 2015 (пока так)
Определение редакции ОС:
Windows 10 N
Windows 10 China
Home Single Language
Home
---
На серверных ОС не тестировал, просьба потестировать.
kotkovets,
Когда то мы обсуждали тормоза обработки WMI запросов... В частности для NSIS есть http://nsis.sourceforge.net/WMI_header.
Без этого хедера многие вещи в NSIS сделать просто не возможно... Но вот скорость работы...
Недавно натолкнулся на обсуждение и преодоление тормозов при использовании WMI - http://bbs.vbstreets.ru/viewtopic.php?f=1&t=43269
Возможно ли как то "подправить" WMI.nsh для ускорения работы ?
tony1990
29-07-2015, 12:24
Всё - таки легко не получилось :) Нужно при тыканье на тип установки на странице компонентов вызывать функцию .onInit, так как в ней определяются компоненты которые нужно или не нужно выводить. Где это можно прописать?
Спасибо
tony1990,
Для стандартных страниц, когда требуется установка x32 компонентов в x64 ОС (ну и само собой х32 в х32 ОС и х64 в х64 ОС) проще манипулировать чекбоксами выбора вариантов установки на странице MUI_PAGE_COMPONENTS
Пользователю предлагается :
в x64 ОС выбрать чекбокс - либо "установка х32 компонентов" либо "установка х64 компонентов". Очень наглядно и удобно.
При установке в х32 ОС эти чекбоксы скрыты. А ещё лучше скрыть только "х64" чекбокс, а чекбокс "х32" оставить не активным.
Для отметки/скрытия чекбоксов используем в Function .onInit , (к примеру, для секции с ID х32 и секции с ID x64) :
SectionSetFlags ${x32} 17 ; не активный ОТМЕЧЕННЫЙ чекбокс секции x32
SectionSetFlags ${x64} 16 ; не активный НЕ отмеченный чекбокс секции x64
SectionSetText ${x64} "" ; скрыть чекбокс секции x64
В зависимости от состояния чекбоксов, устанавливаются флаги отметки секций (к примеру, для секции с ID х32 и секции с ID x64) используем :
!insertmacro UnselectSection ${x64}
!insertmacro SelectSection ${x32}
Ессно совместно с Function .onSelChange
И ещё такой момент. Как правило, пользователю по умолчанию предлагается путь установки ($INSTDIR) - в $PROGRAMFILES. Этот путь ($INSTDIR)
пользователь видит на странице MUI_PAGE_DIRECTORY (там же ессно может и изменить)
Так вот, при установке x32 компонентов в х32 ОС и при установке x64 компонентов в х64 ОС - каталог $PROGRAMFILES одинаков ,т.е. Program Files
А при установке x32 компонентов в х64 ОС, каталог $PROGRAMFILES - Program Files (x86)
Это надо учитывать для правильного отображения $PROGRAMFILES на стандартной странице MUI_PAGE_DIRECTORY.
Т.е. придётся добавить свою MUI_PAGE_CUSTOMFUNCTION_SHOW , в которой в зависимости от состояния чекбоксов выбора разрядности, устанавливаем $INSTDIR с правильным каталогом $PROGRAMFILES
kotkovets
29-07-2015, 15:52
Возможно ли как то "подправить" WMI.nsh для ускорения работы ? »
без понятия, будет желание гляну... :search:
Dodakaedr
29-07-2015, 16:18
Подскажите как добавить текст в буфер обмена?
как добавить текст в буфер обмена? »
http://nsis.sourceforge.net/Copy_to,_or_get_from_Windows_Clipboard
tony1990
30-07-2015, 20:29
Для стандартных страниц, когда требуется установка x32 компонентов в x64 ОС (ну и само собой х32 в х32 ОС и х64 в х64 ОС) проще манипулировать чекбоксами выбора вариантов установки на странице MUI_PAGE_COMPONENTS
Проблема в том что у меня в зависимости от версии программы куча компонентов, которые пользователь может включать/выключать. Поэтому я хотел сделать кастомную страницу с выбором до страницы компонентов. Но столкнулся со сложностями. Похоже что определение видимости/невидимости секций работает только в .onInit. И определяется это только в первый проход. При повторном запуске .onInit ничего не меняется. Короче, уже отчаялся я. Либо делать месседж бокс с выбором в начале .onInit (установка 32 или 64 версии программы) что по дизайну конечно не очень, либо делать 2 разных установщика.
Похоже что определение видимости/невидимости секций работает только в .onInit »
Если пункт в элементе уже существует - его нельзя скрыть, можно только удалить
Если хотите именно скрывать пункты - вам нужно писать свою кастомную страничку, на ней уже будете обрабатывать, какой пункт выбрал пользователь (x32/x64) и в зависимости от выбора заполнять элемент нужными пунктами, очищая перед заполнением, всё это придётся прописывать вручную.
Набрасывать такой код не буду по одной простой причине - не знаю, какой вы хотите видеть кастомную страничку, такой же, как и дефолтная с выпадающим списком - или с выбором типа установки по принципу радиобаттонов и вообще, с помощью чего собираетесь делать кастомную страничку, IO или nsDialogs
Если не браться за кастомную страничку и попытаться реализовать это, то можно сделать с помощью костылей, т.е. код будет не очень красивый и удобный, вот пример этого ужасного кода (не пишите такой код никогда :)):
!define PRODUCT_NAME "Моя программа"
!include "MUI.nsh"
page custom ClickNext ; автоматически жмём кнопку "Далее", чтобы список элементов перестроился автоматически в зависимости от выбора - нам нужно перезагрузить страничку с компонентами, нажав "Назад" и потом "Далее"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW hideBackButton ; Скрываем кнопку "Назад" от пользователя
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"
Name "${PRODUCT_NAME}"
OutFile "setup.exe"
InstallDir "$TEMP"
ShowInstDetails show
InstType /NOCUSTOM
InstType x32
InstType x64
Section /o "Эта секция для 32-bit ОС" SEC_32BIT
SectionIn 1
SectionEnd
Section /o "Эта секция для 64-bit ОС" SEC_64BIT
SectionIn 2
SectionEnd
Function ClickNext ; Жмём кнопку Далее
GetDlgItem $0 $HWNDPARENT 1
SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd
Function hideBackButton ; Скрываем кнопку Назад
GetDlgItem $0 $HWNDPARENT 3
ShowWindow $0 0
FunctionEnd
Function .onSelChange
GetCurInstType $R0 ; Получаем статус выбранного типа установки
${If} $R0 == "0" ; Если первый (x32) - присваиваем текст секциям для x32 системы и скрываем секции с x64 системой
SectionSetText ${SEC_32BIT} "SEC_32BIT"
SectionSetText ${SEC_64BIT} ""
${ElseIf} $R0 == "1"
SectionSetText ${SEC_32BIT} ""
SectionSetText ${SEC_64BIT} "SEC_64BIT"
${EndIf}
GetDlgItem $0 $HWNDPARENT 3
SendMessage $0 ${BM_CLICK} 0 0
FunctionEnd
Function .onInit
Var /Global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process ; 0 = 32-bit ОС, 1 = 64-bit ОС
${If} $IsWow64Process == "0" ; первоначальный выбор типа установки в зависимости от системы пользователя
SetCurInstType 0
SectionSetText ${SEC_32BIT} "SEC_32BIT"
SectionSetText ${SEC_64BIT} ""
${Else}
SetCurInstType 1
SectionSetText ${SEC_32BIT} ""
SectionSetText ${SEC_64BIT} "SEC_64BIT"
${EndIf}
FunctionEnd
!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_64BIT} ""
!insertmacro MUI_DESCRIPTION_TEXT ${SEC_32BIT} ""
!insertmacro MUI_FUNCTION_DESCRIPTION_END
И при всей своей конструкции - он будет работать только при условии, что до странички компонентов у вас ничего не отображается...
С кастомной страничкой это будет выглядеть красивее и удобнее, да и правильнее
у меня в зависимости от версии программы куча компонентов, которые пользователь может включать/выключать. »
Т.е. , кроме разных разрядностей самих приложений ещё и разные компоненты для каждой разрядности ? Никогда не встречал такого бардака... :) Обычно, выбираемые компоненты - общие для разных разрядностей.
Ну, ежели у тебя именно так, то тогда лучший (если не единственный) вариант, как уже сказал K.A.V. - кастомная страница.
Обычно, выбираемые компоненты - общие для разных разрядностей »
Вот вот...При таком раскладе можно просто в секции закинуть проверку на разрядность и распаковывать нужные файлы/записывать данные в реестр основываясь на этом
Либо можно по-другому, без кастомной странички с компонентами: создаём кастомную страничку с двумя радиобаттонами с предложением выбрать, какой тип приложения устанавливать (x32/x64) и уже после этого выбора задействовать тот кусок кода из .onInit, который скрывает "лишние" компоненты
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC