Войти

Показать полную графическую версию : .: 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

Flix
04-01-2018, 17:22
RedCatX, вот простейший пример:
;--------------------------------
!include "MUI2.nsh"
!include "FileFunc.nsh"
;--------------------------------

Name "Modern UI Test"
OutFile "SkipWelcome.exe"
InstallDir "$LOCALAPPDATA\Modern UI Test"
RequestExecutionLevel user

;--------------------------------
;Interface Settings

!define MUI_ABORTWARNING

;--------------------------------
;Pages

!define MUI_PAGE_CUSTOMFUNCTION_PRE ReadOption
!define MUI_PAGE_CUSTOMFUNCTION_SHOW OnOffPageShow
!insertmacro MUI_PAGE_WELCOME

!insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages

!insertmacro MUI_LANGUAGE "Russian"

;--------------------------------

Section "Test"

SectionEnd

;--------------------------------

Function ReadOption
StrCpy $R2 0
${GetParameters} $R0
${GetOptions} $R0 "/skippage" $R1
${Unless} ${Errors}
StrCpy $R2 1
${EndUnless}
FunctionEnd

Function OnOffPageShow
${If} $R2 == 1
Abort
${EndIf}
FunctionEnd
Если запустить файл SkipWelcome.exe без параметров, то будет показана страничка приветствия.
Если запустить его с ключем "/skippage" (SkipWelcome.exe /skippage), то будет показана только страничка установки.

Условие "... и закрывался после завершения" реализуйте самостоятельно. :)

Alex S
04-01-2018, 20:40
Спасибо большое, помогло... Есть еще один вопрос, ответ на который давненько ищу. Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. Имею ввиду ограничить это дерево видом только папки Программы и её подпапок в меню Пуск, а не деревом всего диска C:\. То есть папку(ярлык) можно выбрать или создать в Программы в меню Пуск. Для ясности вопроса прилагаю скрин желаемого вида.

Flix
05-01-2018, 01:42
Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. »
Можно сделать и так. Для этого нужно использовать вызов диалога выбора папок с желаемыми параметрами, которые определяются структурой BROWSEINFO (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx). С помощью флагов (ulFlags) вы можете установить желаемый вид окошка, а при помощи параметра pidlRoot задать корневой каталог, выше которого невозможно будет перейти. Пример вызова диалога выбора папки с пользовательскими настройками приведен в статье "Browse for Folder (http://nsis.sourceforge.net/Browse_for_Folder)" на NSIS Wiki. Вам его необходимо только адаптировать под собственные условия.

Сценарий, который приведен под заголовком "Code", можно поместить в заголовочный файл (*.nsh) и подключить к файлу проекта (!include). А в самом файле проекта вместо инструкции nsDialogs::SelectFolderDialog использовать вызов функции Call BrowseForFolder.

Alex S
10-01-2018, 20:12
Что-то не выходит... Сколько не пытался реализовать прочитанное тут (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx) в скрипте отсюда (http://nsis.sourceforge.net/Browse_for_Folder) (по совету Flix), результат нулевой. Товарищи, помогите кто знает, как решить задачу получения нужного вида...

MKN
12-01-2018, 12:34
результат нулевой »
Уж очень замороченная та кодо-портянка из Wiki... (может когда нибудь соответствующий плагин появится...)

Проще для конкретного выбора при обзоре, использовать системные папки (у каждой папки, своя константа)...
(здесь некоторые константы : http://www.pinvoke.net/default.aspx/Enums.CSIDL )

Пример с константой CSIDL_PROGRAM_FILES 0x26 :


!include "nsDialogs.nsh"
!include "LogicLib.nsh"

OutFile "test_SHGetSpecialFolderLocation.exe"

Section
System::Call 'SHELL32::SHGetSpecialFolderLocation(i0,i0x26,*i.r2)i.r0'
System::Call '*(i$hwndparent,i$2,i,t "Мой текст",i0x241,kr3,i0,i0)i.r1'
System::Call 'SHELL32::SHBrowseForFolder(ir1)i.r0'
System::Call 'OLE32::CoTaskMemFree(ir2)'
System::Free $1
${If} $0 <> 0
System::Call 'SHELL32::SHGetPathFromIDList(i$0,t "" R9)'
MessageBox mb_ok SHBrowseForFolder=$R9
${EndIf}
System::Call 'OLE32::CoTaskMemFree(ir0)'
SectionEnd

skinny21
28-01-2018, 12:05
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. В этой портативки работает https://www.upload.ee/files/7940760/UltraISO_Portable.exe.html

ZVSRus
28-01-2018, 20:52
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер.
Что имеется ввиду под перетаскиванием файла?

skinny21
28-01-2018, 21:04
Что имеется ввиду под перетаскиванием файла? »
drag-n-drop, в извращённом скрипте от Appz и в PAF это работает. Нужно вписать в нормальный скрипт, без всяких костылей в виде Launcher.nsh. Перетаскивание именно на сам лаунчер, а не в окно программы.

ZVSRus
28-01-2018, 21:34
skinny21
в извращённом скрипте от Appz и в PAF это работает
Почему в извращённом, скрипты NSIS заточенные под портативку и те или иные действия прописанные в лаунчере.

Перетаскивание именно на сам лаунчер, а не в окно программы.
Не совсем понятная формулировка, что перетащить, исполняемый файл положить рядом с лаунчером, или как?
И что имеется в формулировке под нормальным скриптом?

skinny21
28-01-2018, 21:43
Не совсем понятная формулировка, что перетащить »
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe

ZVSRus
28-01-2018, 22:02
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe
Снова не понятно, что за образ, и как это закидывается на сам лаунчер.
Может вам нужен лаунчер к портативке собранной в один файл в турбо или тинапе или к портативке от автора программы?

skinny21
28-01-2018, 22:13
что за образ »
Образ Христа Спасителя :)

Flix
29-01-2018, 02:17
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. »
При работе функции Drag-N-Drop средствами виндовс исполняемому файлу в качестве аргумента командной строки передается полный путь к перетаскиваемому файлу. Таким образом, средствами NSIS вам необходимо получить полный путь к перетаскиваемому файлу и передать его файлу программы в качестве аргумента. Параметры командной строки определяются путем чтения значения из переменной $CMDLINE. Есть уже готовая функция, которая выполняет эту операцию: Get command line parameters (http://nsis.sourceforge.net/Get_command_line_parameters)

Вам останется только прикрутить её к вашему сценарию.

Вот простейший пример её использовании (на базе UltraISOPortable по вашей ссылке)

Name "UltraISOPortable"
OutFile "UltraISOPortableTest.exe"
InstallDir $EXEDIR\Temp
RequestExecutionLevel user
SilentInstall silent

Page instfiles

Section ""

SetOutPath $EXEDIR\App\UltraISO

StrCmp $CMDLINE "" 0 param
StrCpy $0 ""
Goto runexe

param:
Call GetParameters
Pop $0

runexe:
Exec '"$EXEDIR\App\UltraISO\UltraISO.exe" $0'

SectionEnd

Function GetParameters

Push $R0
Push $R1
Push $R2
Push $R3

StrCpy $R2 1
StrLen $R3 $CMDLINE

StrCpy $R0 $CMDLINE $R2
StrCmp $R0 '"' 0 +3
StrCpy $R1 '"'
Goto loop
StrCpy $R1 " "

loop:
IntOp $R2 $R2 + 1
StrCpy $R0 $CMDLINE 1 $R2
StrCmp $R0 $R1 get
StrCmp $R2 $R3 get
Goto loop

get:
IntOp $R2 $R2 + 1
StrCpy $R0 $CMDLINE 1 $R2
StrCmp $R0 " " get
StrCpy $R0 $CMDLINE "" $R2

Pop $R3
Pop $R2
Pop $R1
Exch $R0

FunctionEnd

Что делает этот лаунчер? При запуске проверяет наличие аргументов командной строки (в данном случае путь к файлу образа). Если они есть, что считывает их в переменную $0 и передает её в команду запуска программы. Если их нет, то переменной $0 присваивается пустое значение и запуск программы выполняется без параметров.

Чтобы проверить его работу, поместите файл лаунчера UltraISOPortableTest.exe рядом (в одной папке) с оригинальным файлом загрузчика UltraISOPortable.exe. Затем можно просто запустить его или перетянуть на него файл образа.

Все.

skinny21
29-01-2018, 09:43
Flix,
Огромная благодарность, неделю искал выход из этой ситуации.

Alex S
29-01-2018, 15:07
Мужики, добрый день. Помогите с кодом. Возникла проблема при создании информационной страницы. Идея такова: в зависимости от выбранного языка на странице (в Control EDIT) должен показаться текст из текстового файла соответствующего языка. То есть если выбран русский язык инсталлятора, то текст отображается из файла info_ru.txt, если английский язык, то текст отображается из файла info_en.txt. Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка.
!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"

Page custom InfoBeforePage
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"


Name "${PRODUCT_NAME}"
OutFile "InfoBeforePage.exe"

Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
InitPluginsDir
;${If} ${LANG_RUSSIAN}
File "/oname=$PLUGINSDIR\info.txt" "info_ru.txt"
; ${Else}
; File "/oname=$PLUGINSDIR\info.txt" "info_en.txt"
;${EndIf}
FileOpen $4 "$PLUGINSDIR\info.txt" r
FileRead $4 $1 ; Read a line
FileClose $4
FunctionEnd

Function InfoBeforePage
nsDialogs::Create 1018
Pop $InfoPage
${If} $InfoPage == error
Abort
${EndIf}
!insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."
!define MYMULTILINEEDIT_STYLE ${DEFAULT_STYLES}|${WS_TABSTOP}|${ES_AUTOHSCROLL}|${ES_MULTILINE}|${ES_READONLY}
nsDialogs::CreateControl EDIT ${MYMULTILINEEDIT_STYLE} ${WS_EX_WINDOWEDGE}|${WS_EX_CLIENTEDGE} 0u 0u 300u 140u "$1"
Pop $InfoBeforePage_Control_EDIT
nsDialogs::Show
FunctionEnd

Section "MainSection" SEC01
SectionEnd

Flix
29-01-2018, 18:06
Возник ряд проблем, при чтении из текстового файла (FileOpen-FileRead) текст отображается с крякозябликами и считывается только первая строка. »
Почитайте в справке информацию по команде FileRead, а также ограничения её использования. Кратко укажу основные моменты, которые важно знать. Первое, текст должен быть в кодировке ANSI. Второе, длина строки не должна превышать 1024 символов. Третье, команда считывает только строку, а не весь документ.

Теперь по вашему сценарию. С учетом того, что команда считывает только строку, то необходимо организовать цикл с поочередным чтением всех строк до конца файла. После чтения каждой строки, её необходимо передавать элементу управления. Таким образом, в простейшем варианте эту задачу можно выполнить так (на базе вашего сценария):


!define PRODUCT_NAME "MyProg"

Var InfoPage
Var InfoBeforePage_Control_EDIT

!include "MUI2.nsh"
!include "nsDialogs.nsh"
!include "LogicLib.nsh"

;--------------------------------
;General

Name "${PRODUCT_NAME}"
OutFile "InfoBeforePage.exe"

;--------------------------------
;Interface Settings

!define MUI_ABORTWARNING

;Show all languages, despite user's codepage
!define MUI_LANGDLL_ALLLANGUAGES

;--------------------------------
;Pages
Page custom InfoBeforePage
!insertmacro MUI_PAGE_INSTFILES

;--------------------------------
;Languages
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "Russian"

;--------------------------------
;Installer Sections
Section "MainSection" SEC01
SectionEnd

;--------------------------------
;Installer Functions
Function .onInit

!insertmacro MUI_LANGDLL_DISPLAY
InitPluginsDir
SetOutPath $PLUGINSDIR
${If} $LANGUAGE = ${LANG_RUSSIAN}
; Документ должен быть в кодировке ANSI !!!
File /oname=$PLUGINSDIR\info.txt info_ru.txt
${Else}
; Документ должен быть в кодировке ANSI !!!
File /oname=$PLUGINSDIR\info.txt" info_en.txt
${EndIf}

FunctionEnd

Function InfoBeforePage

nsDialogs::Create 1018
Pop $InfoPage
${If} $InfoPage == error
Abort
${EndIf}
!insertmacro MUI_HEADER_TEXT "Dialog title..." "Dialog subtitle..."

; === RichText1 (type: RichText) ===
!define MYMULTILINEEDIT_STYLE ${WS_VISIBLE}|${WS_CHILD}|${WS_TABSTOP}|${WS_VSCROLL}|${ES_MULTILINE}|${ES_WANTRETURN}
nsDialogs::CreateControl "RichEdit20A" ${MYMULTILINEEDIT_STYLE} ${WS_EX_STATICEDGE} 0u 0u 300u 140u ""
Pop $InfoBeforePage_Control_EDIT

; === Чтение файла ===
Call ReadTxtFile

nsDialogs::Show

FunctionEnd

; Функция чтения и вывода содержимого файла в элемент "RichEdit20A"
Function ReadTxtFile

; Открываем файл для чтения
FileOpen $4 "$PLUGINSDIR\info.txt" r
loop:
; Считываем строку в переменную $1
FileRead $4 $1
; Передаем строку в элемент "RichEdit20A"
; Флаг ${EM_REPLACESEL} указывает на вставку текста с новой строки
SendMessage $InfoBeforePage_Control_EDIT ${EM_REPLACESEL} 0 "STR:$1"
; Если нет ошибок, переходим к следующей строке
IfErrors +1 loop
; Если ошибка или конец файла, закрываем файл.
FileClose $4

FunctionEnd

Если необходимо чтение документов в кодировке Unicode, то посмотрите в сторону команды FileReadUTF16LE.

Alex S
29-01-2018, 18:38
Flix, респект тебе и уважуха. Выручил...

MKN
30-01-2018, 11:43
должен показаться текст из текстового файла »
Можно упростить код, если использовать не текстовый, а HTML файл (причём любой кодировки и можно с картинками).
Для этого есть несколько плагинов, к примеру, самый известный - WebCtrl.

Комплект примера во вложении.

Выглядеть будет так :
https://b.radikal.ru/b22/1801/5f/65aef4d37ddc.jpg

окно для просмотра можно делать ессно любым способом (наверное лучше через nsDialogs::CreateControl)...

Alex S
30-01-2018, 11:51
MKN , спасибо! Действительно кода в половину меньше...

MKN
30-01-2018, 13:01
К слову, об ограничении FileRead на 1024 символа...
Для ANSI это ограничение можно снять с помощью сообщения EM_LIMITTEXT

К примеру, для вот этого текста ( https://yadi.sk/d/1cLhpTrv3Rukjv )
без EM_LIMITTEXT отображаются только 512 строк, а с EM_LIMITTEXT - все 13229 строк. Еснно такой большой объём долго обрабатывается...

Пример :


OutFile EM_LIMITTEXT-test.exe
!include MUI2.nsh

Page custom MyPage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

Function MyPage
nsDialogs::Create 1044
Pop $0
nsDialogs::CreateControl ${__NSD_Text_CLASS} ${__NSD_Text_STYLE}|${ES_MULTILINE}|${WS_VSCROLL}|${ES_READONLY} ${__NSD_Text_EXSTYLE} 10u 10u 310u 170u ""
Pop $0
FileOpen $4 "$EXEDIR\test.txt" r
loop:
FileRead $4 $1
SendMessage $0 ${EM_REPLACESEL} 0 "STR:$1"
SendMessage $0 ${EM_LIMITTEXT} 0 "STR:$1"
IfErrors +1 loop
FileClose $4
nsDialogs::Show
FunctionEnd

Section
SectionEnd




© OSzone.net 2001-2012