PDA

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


Страниц : 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

K.A.V.
22-07-2015, 23:14
Теперь осталось эту кодировку оформить в скрипте. Вы не знаете как это сделать? »
Что сделать то? Поменять кодировку файла или записать корректно строку в файл с не 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 чтобы знать какой выбран в данный момент или же тут только через кастомную страницу с радиобатонами придётся решать?

Заранее благодарен.

K.A.V.
26-07-2015, 22:28
Есть ли какой-нибудь флаг типа установки 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
установщик будет ждать завершения процесса.
Спасибо!

BuZzOFF
28-07-2015, 11:14
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 поместить все перечисленные значения из текстового файла, а не одно значение поочерёдно.
Что-то сообразить не могу...

K.A.V.
28-07-2015, 11:26
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

---
На серверных ОС не тестировал, просьба потестировать.

MKN
29-07-2015, 11:22
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, так как в ней определяются компоненты которые нужно или не нужно выводить. Где это можно прописать?
Спасибо

MKN
29-07-2015, 13:41
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
Подскажите как добавить текст в буфер обмена?

MKN
29-07-2015, 16:21
как добавить текст в буфер обмена? »
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 разных установщика.

K.A.V.
31-07-2015, 06:07
Похоже что определение видимости/невидимости секций работает только в .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

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

MKN
31-07-2015, 12:26
у меня в зависимости от версии программы куча компонентов, которые пользователь может включать/выключать. »
Т.е. , кроме разных разрядностей самих приложений ещё и разные компоненты для каждой разрядности ? Никогда не встречал такого бардака... :) Обычно, выбираемые компоненты - общие для разных разрядностей.
Ну, ежели у тебя именно так, то тогда лучший (если не единственный) вариант, как уже сказал K.A.V. - кастомная страница.

K.A.V.
31-07-2015, 12:36
Обычно, выбираемые компоненты - общие для разных разрядностей »
Вот вот...При таком раскладе можно просто в секции закинуть проверку на разрядность и распаковывать нужные файлы/записывать данные в реестр основываясь на этом

Либо можно по-другому, без кастомной странички с компонентами: создаём кастомную страничку с двумя радиобаттонами с предложением выбрать, какой тип приложения устанавливать (x32/x64) и уже после этого выбора задействовать тот кусок кода из .onInit, который скрывает "лишние" компоненты




© OSzone.net 2001-2012