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.
16-02-2014, 14:28
HM NIS Edit 2.0.3 не может открыть скомпилированный файл. »
Баг версии, у меня точно также, в версии 2.0.1 такой проблемы нет, насчет 2.0.2 не знаю
Я вообще через NIS Edit отучился запускать инсталляшки, т.к. уж очень часто редактор сваливается в краш с закрытием всех открытых файлов, когда пишу "креатор" - открытых файлов может быть штук ~10, и уж очень неудобно потом вспоминать, где был курсор в каждом редактируемом файле, так что я компилю через контекстое меню, а NIS Edit - просто редактор, пока лень брать другой, не особо много уже пишу на NSIS

Kopejkin
17-02-2014, 02:13
Ну если вы не "особо много пишете", то значит я вообще ничего не пишу :) А где взять версию 2.0.1? Я как-то привык к HM NIS Edit.

Begin2Fly
17-02-2014, 09:02
А где взять версию 2.0.1? »
http://sourceforge.net/projects/hmne/files/HM%20NIS%20Edit/

Vincent7
20-02-2014, 00:13
Здравствуйте господа. Такой вопрос, можно ли декомпилировать эти плагины как нибудь чтобы узнать как ими пользоваться? взяты из nsis установщика.
http://gfile.ru/a5twO

K.A.V.
20-02-2014, 00:46
можно ли декомпилировать эти плагины как нибудь чтобы узнать как ими пользоваться? »
Либо спросите у BioWare, либо только методом тыка (а может, я просто в этой теме не особо шарю и можно как-то по-другому :)), список функций можно узнать, а для чего данные функции нужны и какие параметры передавать в них - сидите копайтесь сами, если нужно
Список функций:
nsisDirSelect::Null
nsisDirSelect::Unload
nsisDirSelect::rSelect
nsisDirSelect::silentDirSelect
nsisNextFile::GetNextFile
nsisNextFile::Null
nsisUnRar2::Extract
nsisUnRar2::GetUnpackedTotals
nsisUnRar2::Null
nsisUnRar2::SetProgressBar
nsisUnRar2::UnloadUnrarDLL
unrar::RARCloseArchive
unrar::RARGetDllVersion
unrar::RAROpenArchive
unrar::RAROpenArchiveEx
unrar::RARProcessFile
unrar::RARProcessFileW
unrar::RARReadHeader
unrar::RARReadHeaderEx
unrar::RARSetCallback
unrar::RARSetChangeVolProc
unrar::RARSetPassword
unrar::RARSetProcessDataProc
unrar::___CPPdebugHook

Например, можно распаковать файлы из RAR архива вот такой командой:
nsisUnRar2::Extract "$DESKTOP\plugins.rar" "$DESKTOP\TEST"
1ый параметр - путь к RAR архиву, 2ой - директория назначения
И команда не отработает в .onInit функции, плагину нужен графический интерфейс инсталлятора (может, покопаетесь и получится, я не стал сидеть разбираться), поэтому конкретно данная команда отработает только в секциях

Kopejkin
20-02-2014, 17:04
...в версии 2.0.1 такой проблемы нет, насчет 2.0.2 не знаю... »
В версии 2.0.2 такой проблемы тоже нет.

Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами?

И еще. Нужно предоставить пользователю возможность запуска программы после её установки на финишной странице инсталлятора. Нюанс в том, что инсталлятор универсальный: для х86/х64. Программа, устанавливаемая на 64-разр. ОС имеет одно имя, а на 32-разр. - другое.
Собственно, разница в именах небольшая, но она есть: WinSnap64.exe и WinSnap.exe? Путь установки по-умолчанию одинаков для систем обеих разрядностей - C:\Program Files\WinSnap.

Может здесь кто-нибудь уже решал подобные проблемы? Ткните носом, пожалуйста?

K.A.V.
20-02-2014, 17:59
Подскажите, как в инсталляторе отобразить еще одну страничку, не обязательно после странички с лицензионным сообщением, в которой текст из rtf/txt файла будет отображен на том языке, который был выбран в начале установки, т.е. подобно странице лицензии? Создавать кастомную страницу или можно обойтись штатными средствами? »
Можно штатными средствами, но у меня, к примеру, не получается изменить текст в шапке, где пишется "Лицензионное соглашение" и "Прочтите условия соглашения бла бла бла", поэтому в своём креаторе я написал функции по скрытию данного текста при показе файла информации, если устроит такой вариант - пользуйтесь

И еще. Нужно предоставить пользователю возможность запуска программы после её установки на финишной странице инсталлятора. Нюанс в том, что инсталлятор универсальный: для х86/х64. Программа, устанавливаемая на 64-разр. ОС имеет одно имя, а на 32-разр. - другое.
Собственно, разница в именах небольшая, но она есть: WinSnap64.exe и WinSnap.exe? Путь установки по-умолчанию одинаков для систем обеих разрядностей - C:\Program Files\WinSnap.
Может здесь кто-нибудь уже решал подобные проблемы? Ткните носом, пожалуйста? »
Сразу приведу вам весь готовый код ваших хотелок, по отдельности нет желания разжевывать куски кода, поэтому распишу весь код сразу
!define MUI_LICENSEPAGE_TEXT_BOTTOM "$(^ClickNext)" ; меняем текст под элементом отображения текста информация (за место инфы о принятии соглашения будет просто "Нажмите кнопку далее")
!define MUI_PAGE_CUSTOMFUNCTION_PRE TextInfoPage ; функция для скрытия двух строк в шапке, об этом я написал в начале своего сообщения
!insertmacro MUI_PAGE_LICENSE "$(infotext)" ; здесь мы указываем, что следует показать файл информации, в зависимости от выбранного языка
!define MUI_PAGE_CUSTOMFUNCTION_PRE TextInfoPage2 ; функция для показа двух строк в шапке, об этом я написал в начале своего сообщения, чтобы на страничке Лицензии данные строки были видны
!insertmacro MUI_PAGE_LICENSE "$(license)" ; здесь мы указываем, что следует показать файл лицензии, в зависимости от выбранного языка

!insertmacro MUI_PAGE_INSTFILES

!define MUI_FINISHPAGE_RUN ; Добавляем галочку запуска приложения на финишной странице
!define MUI_FINISHPAGE_RUN_TEXT "$(runprogram)" ; текст запуска программы, в зависимости от языка
!define MUI_FINISHPAGE_RUN_FUNCTION RunProgramFunc ; функция запуска приложения, именно здесь мы решим, какой EXE файл нам необходимо запустить
!insertmacro MUI_PAGE_FINISH ; подключаем финишную страничку

; ------------
!insertmacro MUI_LANGUAGE "Russian" ; подключаем язык
!insertmacro MUI_LANGUAGE "English" ; подключаем язык
LicenseLangString infotext ${LANG_RUSSIAN} "C:\Users\APTEM\Desktop\Text_Russian.txt" ; файл с информацией на русском языке
LicenseLangString infotext ${LANG_ENGLISH} "C:\Users\APTEM\Desktop\Text_English.txt" ; файл с информацией на английском языке

LicenseLangString license ${LANG_RUSSIAN} "C:\Users\APTEM\Desktop\license_Russian.txt" ; файл с лицензией на английском языке
LicenseLangString license ${LANG_ENGLISH} "C:\Users\APTEM\Desktop\license_English.txt" ; файл с лицензией на английском языке

LangString runprogram ${LANG_RUSSIAN} "Запустить приложение" ; текст запуска приложения на русском языке
LangString runprogram ${LANG_ENGLISH} "Run program" ; текст запуска приложения на английском языке

Теперь добавим остальные функции:
Функции для скрытия/показа текста в шапке
Function TextInfoPage
GetDlgItem $1 $HWNDPARENT 1037
ShowWindow $1 0
GetDlgItem $1 $HWNDPARENT 1038
ShowWindow $1 0
GetDlgItem $1 $HWNDPARENT 1
SendMessage $1 0x000C 0 "STR:$(^NextBtn)" ; этой командой при показе странички информации мы меняем имя кнопки на "Далее"
FunctionEnd

Function TextInfoPage2
GetDlgItem $1 $HWNDPARENT 1037
ShowWindow $1 1
GetDlgItem $1 $HWNDPARENT 1038
ShowWindow $1 1
FunctionEnd

Функция запуска приложения на финишной страничке в зависимости от разрядности ОС
Function RunProgramFunc
var /global IsWow64Process
System::Call kernel32::GetCurrentProcess()i.s
System::Call kernel32::IsWow64Process(is,*i.s)
Pop $IsWow64Process
StrCmp $IsWow64Process "1" 0 +2
exec "$INSTDIR\MyProgram_x64.exe"
StrCmp $IsWow64Process "0" 0 +2
exec "$INSTDIR\MyProgram.exe"
FunctionEnd

Если ничего не забыл, то должно работать :)

Kopejkin
21-02-2014, 03:58
Цитата K.A.V.:
...не получается изменить текст в шапке.. »
Это называется "заработался". Я на этом тоже подорвался :) Поэтому и спрашивал.

Чтобы заменить текст, нужно для строк 1-4 использовать LangString
А для последней, пятой - LicenseLangString


!define MUI_PAGE_HEADER_TEXT "$(info_title)" ;1. где "Лиц. соглашение"
!define MUI_PAGE_HEADER_SUBTEXT "$(info_subtitle)" ;2. где "Прочтите условия.."
!define MUI_LICENSEPAGE_TEXT_BOTTOM " * * * * * * * *" ;3. текст под текстовым полем
!define MUI_LICENSEPAGE_BUTTON "$(info_button)" ;4. текст на кнопке "Далее"
!insertmacro MUI_PAGE_LICENSE "$(infotext)" ;5. имя файла с текстом
А за финишную страничку еще раз спасибо.

Vincent7
21-02-2014, 18:25
Подскажите, как сделать чтобы при при отмене на странице установки файлов, установщик переходил на финишную страницу. А у меня при отмене почему то выполняется скрытая секция, мне это не нужно.

kotkovets
21-02-2014, 19:25
установщик переходил на финишную страницу »
в данном случае поможет только отрисовка своей странички финиша
в функции abort отрисовываем нужную страничку или прыгаем на стандарт, подбирая циферку
!include "MUI2.nsh"

!define MUI_ABORTWARNING
!define MUI_ABORTWARNING_TEXT "отменить установку?"
!define MUI_CUSTOMFUNCTION_ABORT Abort
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile test.exe

Section

SectionEnd


Function Abort
MessageBox MB_OK "abort" IDOK
SendMessage $HWNDPARENT "0x408" "$R9" "цифра"
FunctionEnd
примеры есть прыжки по страничкам и здесь на форуме я не раз выкладывал
http://nsis.sourceforge.net/Go_to_a_NSIS_page#Modern_UI

Vincent7
22-02-2014, 22:24
!include "MUI2.nsh"
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile "test.exe"

Section
DetailPrint "Installing"
Sleep 3000
SectionEnd

Function rgo
IntCmp $9 0 0 move move
StrCmp $9 "X" 0 move
StrCpy $9 "120"
move:
SendMessage $HWNDPARENT "0x408" "$9" ""
FunctionEnd

Function Exit
StrCpy $9 1
Call rgo
Abort
FunctionEnd
выдает ошибку в функции exit по завершению компилирования

Begin2Fly
22-02-2014, 22:28
выдает ошибку в функции exit по завершению компилирования »
Не ошибку, а уведомление о том, что эта функция не вызывалась.
1 warning: install function "Exit" not referenced - zeroing code (260-264) out
Переводчик вам в помощь.

Vincent7
23-02-2014, 00:18
но она ведь вызывается. разве нет?
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit

K.A.V.
23-02-2014, 00:55
но она ведь вызывается. разве нет? »
Вам самому не стыдно здесь писать? Вам показывают код, от вас требуется только скопировать нужные строки и вставить в свой код, но вы даже этого не можете сделать. И это было видно сразу, ещё в то время, когда я вам тут пытался помочь - вы всё-равно пишите свой код, но чуть-чуть похожий на тот, что вам предлагают:

Вам показали:
!define MUI_CUSTOMFUNCTION_ABORT Abort »

А вы у себя написали:
!define MUI_PAGE_CUSTOMFUNCTION_ABORT Exit »

wolkow70
23-02-2014, 10:29
Столкнулся с такой проблемой: не могу через макрос
${GetOptions} $CMDLINE "/D=" $0
прочитать значение ключа "/D=" в командной строке. Устанавливается флаг ошибки, и в переменной пусто.
Причем для любой другой буквы параметр читается, а для "D" нет.
Понимаю, что этот ключ специфичный, но нужно из функции .OnInit прочитать значение, или хотя-бы проверить на наличие ключа.
Кто нибудь может дать подсказку?

Begin2Fly
23-02-2014, 12:48
wolkow70, а если пойти другим путём и вместо проверки самого ключа посмотреть на то, за что он отвечает?
То есть в данном случае за смену папки установки, поэтому, как вариант:

${IfNot} $INSTDIR == "%ПАПКА УСТАНОВКИ ПО УМОЛЧАНИЮ%"
MessageBox MB_OK "Ключ /D присутствует и его значение: $INSTDIR"
${Else}
MessageBox MB_OK "Ключ /D если и присутствует, то папка установки совпадает с папкой по умолчанию"
${EndIf}

wolkow70
23-02-2014, 13:15
wolkow70, а если пойти другим путём и вместо проверки самого ключа посмотреть на то, за что он отвечает?
То есть в данном случае за смену папки установки, поэтому, как вариант: »

Примерно по такому пути пока и пошел. Сделал примерно так:

Var CmdInstallDirectory
InstallDir "$INSTDIR"

Function .OnInit
StrCpy $CmdInstallDirectory "$INSTDIR"
;
здесь разный код, в том числе переназначение $INSTDIR по нужным условиям
;
${If} "$CmdInstallDirectory" == ""
${Else}
StrCpy "$INSTDIR" "$CmdInstallDirectory"
${EndIf}
FunctionEnd

Получается, что если нет ключа /D= , то $INSTDIR меняется в функции, а если ключ /D= присутствует, то значение $INSTDIR восстанавливается в конце функции из ключа /D=.

Kopejkin
23-02-2014, 13:22
Цитата MKN:
Появился новый "шкурный" проект для NSIS : VCL Styles for NSIS » Пытался сделать полностью черный скин на основе AquaGraphite.vsf

http://savepic.su/4137240m.png (http://savepic.su/4137240.htm)

Оригинальный AquaGraphite

http://savepic.su/4143384m.png (http://savepic.su/4143384.htm)

Переделанный мною скин

Перекрасил на изображении скина все, что нужно... и не нужно (обведено красным) :)
Но так и не избавился от серого фона окна. Может кто подскажет, где и что отвечает за цвет фона окна?
В редакторе скинов просмотрел все вкладки - ничего похожего на значение цвета или ссылку на изображение скина не нашел. А может быть не заметил?
P.S. У меня на Win7 (x64) с этими шкурками противно мерцает полоска прогресс-бара.

На ту же тему.
В редакторе скинов SHeditor (SkinSharp) для создания нового скина нужно загрузить изображение скина и прописать (установить в визуальном редакторе) координаты всех элементов (гемор еще тот). "Подсунуть" редактору измененное изображение скина можно, но тогда он теряет значение всех координат. Т.е. возвращаемся к тому, с чего начинали. Нет ли способа попроще?
Изображение готового скина можно экспортировать (только *.bmp). Допустим, я разукрашу это изображение так, как мне нужно. Работка тоже не из простых, но где-то и поработать не грех :)
Формат и итоговый размер изображения можно настроить. А вот как узнать, хотя бы в том же hex-редакторе, в каком формате изображение было в коде и где этот кусок кода находится?

K.A.V.
23-02-2014, 13:30
Столкнулся с такой проблемой: не могу через макрос
${GetOptions} $CMDLINE "/D=" $0
прочитать значение ключа "/D=" в командной строке. Устанавливается флаг ошибки, и в переменной пусто.
Причем для любой другой буквы параметр читается, а для "D" нет. »
Читайте командную строку через API функцию:
Function .onInit
var /global CommandLine
System::Call "Kernel32::GetCommandLine()t.r0"
StrCpy $CommandLine $0
MessageBox MB_OK|MB_ICONINFORMATION "$CommandLine"
FunctionEnd

wolkow70
23-02-2014, 14:03
Читайте командную строку через API функцию: »

Да, спасибо, работает. Затем можно и ${GetOptions} применить.
В общем, работает так:

Function .OnInit
var /global CommandLine
System::Call "Kernel32::GetCommandLine()t.r0"
StrCpy $CommandLine $0
ClearErrors
${GetOptions} $CommandLine "/D=" $R0
IfErrors +2
StrCpy $INSTDIR "$R0"
Pop $R0
FunctionEnd




© OSzone.net 2001-2012