Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
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), то будет показана только страничка установки.
Условие "... и закрывался после завершения" реализуйте самостоятельно. :)
Спасибо большое, помогло... Есть еще один вопрос, ответ на который давненько ищу. Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. Имею ввиду ограничить это дерево видом только папки Программы и её подпапок в меню Пуск, а не деревом всего диска C:\. То есть папку(ярлык) можно выбрать или создать в Программы в меню Пуск. Для ясности вопроса прилагаю скрин желаемого вида.
Как можно изменить вид дерева папок, отображаемого в окне выбора каталога. »
Можно сделать и так. Для этого нужно использовать вызов диалога выбора папок с желаемыми параметрами, которые определяются структурой 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.
Что-то не выходит... Сколько не пытался реализовать прочитанное тут (https://msdn.microsoft.com/en-us/library/windows/desktop/bb773205(v=vs.85).aspx) в скрипте отсюда (http://nsis.sourceforge.net/Browse_for_Folder) (по совету Flix), результат нулевой. Товарищи, помогите кто знает, как решить задачу получения нужного вида...
результат нулевой »
Уж очень замороченная та кодо-портянка из 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
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер.
Что имеется ввиду под перетаскиванием файла?
skinny21
28-01-2018, 21:04
Что имеется ввиду под перетаскиванием файла? »
drag-n-drop, в извращённом скрипте от Appz и в PAF это работает. Нужно вписать в нормальный скрипт, без всяких костылей в виде Launcher.nsh. Перетаскивание именно на сам лаунчер, а не в окно программы.
skinny21
в извращённом скрипте от Appz и в PAF это работает
Почему в извращённом, скрипты NSIS заточенные под портативку и те или иные действия прописанные в лаунчере.
Перетаскивание именно на сам лаунчер, а не в окно программы.
Не совсем понятная формулировка, что перетащить, исполняемый файл положить рядом с лаунчером, или как?
И что имеется в формулировке под нормальным скриптом?
skinny21
28-01-2018, 21:43
Не совсем понятная формулировка, что перетащить »
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe
В данном случае, берётся образ и закидывается на сам лаунчер UltraISOPortable.exe
Снова не понятно, что за образ, и как это закидывается на сам лаунчер.
Может вам нужен лаунчер к портативке собранной в один файл в турбо или тинапе или к портативке от автора программы?
skinny21
28-01-2018, 22:13
что за образ »
Образ Христа Спасителя :)
Подскажите как сделать так чтобы работало открытие файла, путём перетаскивания файла на лаунчер. »
При работе функции 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,
Огромная благодарность, неделю искал выход из этой ситуации.
Мужики, добрый день. Помогите с кодом. Возникла проблема при создании информационной страницы. Идея такова: в зависимости от выбранного языка на странице (в 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
Возник ряд проблем, при чтении из текстового файла (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.
Flix, респект тебе и уважуха. Выручил...
должен показаться текст из текстового файла »
Можно упростить код, если использовать не текстовый, а HTML файл (причём любой кодировки и можно с картинками).
Для этого есть несколько плагинов, к примеру, самый известный - WebCtrl.
Комплект примера во вложении.
Выглядеть будет так :
https://b.radikal.ru/b22/1801/5f/65aef4d37ddc.jpg
окно для просмотра можно делать ессно любым способом (наверное лучше через nsDialogs::CreateControl)...
MKN , спасибо! Действительно кода в половину меньше...
К слову, об ограничении 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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.