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-07-2014, 21:40
Уважаемые, возможно ли сделать так что бы установщик переименовал сам себя? Например был файл скомпилированный в nsis file.exe после запуска он в той же директории переименовал себя в file1.exe и продолжал выполнять постановленные задачи?
Ну или как реализовать альтернативный вариант (более закрученый): установщик запущенный из одной директории, путь его расположения помещается в переменную, установщик копирует себя в папку скажем темп, по старому пути удаляется и продолжает выполнять задания по пути из переменной. »
Вроде последовательность действий сами описали, неужели код получится сложный? Пара команд...Тем более, что описание данных команд есть в справочнике. Опять же, если бы все прочли справочник "от корки до корки" и знали бы, какими командами могли воспользоваться, то такие посты бы не появлялись...

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


!include "FileFunc.nsh"

Name "test"
OutFile "setup.exe"
InstallDir "$TEMP"


Function .onInit
call InstallerRenameFunc
FunctionEnd


Function InstallerRenameFunc
var /global CommandLine
${GetExeName} $R0
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/renamed" $0
iferrors 0 noRename
File "/oname=$TEMP\rename.exe" "rename.exe"
exec '"$TEMP\rename.exe" /fullpath=$R0'
quit
noRename:
FunctionEnd


Section
SectionEnd



Код файла, который будет переименовывать основной файл пакета инсталлятора:
!include "FileFunc.nsh"

Name "test"
OutFile "rename.exe"
InstallDir "$TEMP"

Function .onInit
call RenameFunc
FunctionEnd


Function RenameFunc
var /global CommandLine
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/fullpath=" $0
IfFileExists "$0" 0 noRename
${GetParent} "$0" $R0
Rename "$0" "$R0\Новое имя файла.exe"
sleep 1000
exec '"$R0\Новое имя файла.exe" /renamed'
noRename:
quit
FunctionEnd

Section
SectionEnd

2. Код

!include "FileFunc.nsh"

Name "test"
OutFile "!test.exe"
InstallDir "$TEMP"

Function .onInit
call CopyInstaller
FunctionEnd


Function CopyInstaller
var /global CommandLine
${GetExeName} $R0
${GetParameters} $CommandLine
${GetOptions} "$CommandLine" "/copydone" $0
iferrors 0 noCopy
CopyFiles /silent "$R0" "$TEMP\$EXEFILE"
exec '"$TEMP\$EXEFILE" /copydone /fullpath=$R0'
quit
noCopy:
${GetOptions} "$CommandLine" "/fullpath=" $0
Delete "$0"
IfFileExists "$0" -1 0
FunctionEnd




Section
SectionEnd

MKN
17-07-2014, 11:34
Переименовать файл активного процесса нельзя »
Но ведь этот файл можно скопировать , а потом скопированный файл переименовать и далее его запускать, закрыв исходный файл.
И можно обойтись без внешнего EXE...
Вот так у меня работает :

OutFile "file.exe"
!include "LogicLib.nsh"

Function .onInit
${If} ${FileExists} "$EXEDIR\file1.exe"
Call RunFile1
${Else}
CopyFiles "$EXEDIR\file.exe" "$EXEDIR\file1.exe"
${EndIf}
FunctionEnd

Function RunFile1
MessageBox MB_OK "Выполняется file1"
; здесь код действий установки
FunctionEnd

Function .onInstSuccess
Sleep 300
Delete "$EXEDIR\file.exe"
nsRestart::FindProcess "file1.exe"
Pop "$1"
${If} $1 == 0
nsRestart::KillProcess "file1.exe"
${Else}
Sleep 300
Exec "$EXEDIR\file1.exe"
${EndIf}
FunctionEnd

Section
SetAutoClose true
SectionEnd


Установочное хозяйство помещаем в Function RunFile1

K.A.V.
17-07-2014, 18:20
Но ведь этот файл можно скопировать »
Вопрос был про переименование, я ответил про переименование
Ниже мой пример идёт уже по копированию инсталлера

Представь, что инсталлер весит порядка 1 Гб+файл на флешке и ты такой запускаешь инсталлер и наблюдаешь странную картину...
Вообще не понимаю, зачем инсталлятору такой функционал, больше напомнило на разработку некого подобия зловреда

natasha_82
18-07-2014, 12:54
profcom, K.A.V.,
Спасибо ограмное - я не много запуталась с ini файлом, уже справилась.
K.A.V., /D - для меня не подходить((, т.к. в момент инсталляции указывается 2 не зависимые директории
зато теперь мучаюсь с UAC

Otlanta
24-07-2014, 11:01
Как сгенерировать рандомное значение по типу:

D-346-3464-4364-3466

MKN
24-07-2014, 12:35
Как сгенерировать рандомное значение по типу:
D-346-3464-4364-3466 »
Генеришь рандомное значение (многоциферок одной строкой, как - уже было в теме )
Извлекаешь из рандомной строки и заносишь в переменные (например в $1 $2 $3 $4 $5 ) - сначала первый символ из рандомного значения, в следующую - со второго по четвёртый символ (или как надо) и т.д.
Затем всю эту компанию помещаешь в "конечную" переменную StrCpy $R0 "$1-$2-$3-$4-$5"

Otlanta
26-07-2014, 00:16
Возникла проблема, WriteRegBin не работает с переменными. Бинарное значение большое более 2000 символов, берем http://nsis.sourceforge.net/Special_Builds#Large_strings, далее берем плагин Registry:
${registry::Write} "HKEY_CURRENT_USER\Software\Test" "ID" "3765685853358583585583" "REG_BINARY" $7

В итоге, значение создается не полностью, записываются лишь 1024 символа. Пробуем тоже самое с RegistryFunc.nsh:

${WriteRegBin} "HKCU\Software\Test" "ID" 5383358853855868358558538
IfErrors 0 +2
MessageBox MB_ICONSTOP|MB_OK "error" IDOK

Ошибка, параметр не создаётся.

Для полноты картины по пробовали и плагин RegBin тоже ошибка. Проверка версии показывает:
---------------------------
Size Max_StrLen
---------------------------
NSIS_MAX_STRLEN = 8192
---------------------------
OK
---------------------------
Вроде всё, ок, корректно записывает такой длинный параметр только стандартный WriteRegBin, но он не работает с переменными, а значение получается именно от туда. Какие пути решения задачи имеются?

Тестировалось на Windows XP.

UPDATE: Команда:
nsExec::exec 'reg add "HKEY_CURRENT_USER\Test" /f /v "ID" /t REG_BINARY /d "447454574574574545"'
Оставляет ещё меньше символов 860 :(

K.A.V.
26-07-2014, 08:11
Otlanta, c большинством плагинов идут исходники, много плагинов давно не обновлялись и в исходниках у них жестко прописано ограничение в 1024 символа, в данном случае нужно взять исходники плагина Registry, установить Visual C++ 6.0 и поменять всего одно значение в исходниках, и "новый" плагин без ограничения в 1024 символа строки готов

Держите готовый Registry.dll, выставил ограничение строки в 8192 символа

vosya
28-07-2014, 14:08
Данная команда выводит окошко с заданным текстом.

MessageBox [тип сообщения] [текст сообщения] [/SD return] [return jumpto] [return2 jumpto_2]


а есть способ переноса строк в сообщениях?

Begin2Fly
28-07-2014, 14:11
а есть способ переноса строк в сообщениях? »
Есть: http://nsis.sourceforge.net/Docs/Chapter4.html#4.2.4

MaGoth
04-08-2014, 22:49
Привет народ, :)

alexfinik,
MaGoth, да, пример был бы очень неплох. У меня многомодульный инсталлятор, поэтому наверное, лучше пример от тебя - и тебе легче, чтобы не копаться с моим кодом, и мне, наверное. »
Отсутствовал некоторое время, потому не помню и не в курсе, проблема решена уже и нужен ли еще файл?

Друзья, может всё-таки кто-то знает почему данный код может не работать? »
Скорее проблема у тебя на стороне, у меня скрипт прекрасно скомпилился и все отображается как надо (NSIS-2.46.5 UNICODE).


AlekseyPopovv,
Как привязать реестр к выбору языка? »
У себя скриптах на юникоде, я делаю примерно так:
...
InstallDir "$PROGRAMFILES\"
!define PROG_UNINST_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PROG_NAME_TEXT}"
!define PROG_UNINST_ROOT_KEY "HKLM"
!define PROG_RKEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PROG_NAME_TEXT}"
InstallDirRegKey HKLM "${PROG_RKEY}" "InstallLocation"
AllowRootDirInstall true
...

Далее, после кастомных функций или команды RequestExecutionLevel admin, прописываем:
!define MUI_LANGDLL_REGISTRY_ROOT "${PROG_UNINST_ROOT_KEY}" "HKCU"
!define MUI_LANGDLL_REGISTRY_KEY "${PROG_UNINST_KEY}" "Software\Modern UI Test"
!define MUI_LANGDLL_REGISTRY_VALUENAME "${PROG_NAME_FILE}: Language"

После строки кода !insertmacro MUI_PAGE_WELCOME прописываем:
LicenseData $(mylicense)
!insertmacro MUI_PAGE_LICENSE $(mylicense)
Если лицензия будет нужна.

После строки кода !insertmacro MUI_UNPAGE_FINISH прописываем используемые языки, например:
!insertmacro MUI_LANGUAGE "ENGLISH"
!insertmacro MUI_LANGUAGE "ROMANIAN"
!insertmacro MUI_LANGUAGE "GERMAN"
!insertmacro MUI_LANGUAGE "RUSSIAN"
!insertmacro MUI_LANGUAGE "ITALIAN"
!insertmacro MUI_LANGUAGE "CZECH"
!insertmacro MUI_LANGUAGE "POLISH"
!insertmacro MUI_LANGUAGE "SPANISH"

Здесь же, указываем расположение файлов на разных языках и в разных папках, если требуется:
LicenseLangString mylicense ${LANG_ENGLISH} ".\licens\en\licence.rtf"
LicenseLangString mylicense ${LANG_ROMANIAN} ".\licens\ro\licence.rtf"
LicenseLangString mylicense ${LANG_GERMAN} ".\licens\de\licence.rtf"
LicenseLangString mylicense ${LANG_RUSSIAN} ".\licens\ru\licence.rtf"
LicenseLangString mylicense ${LANG_ITALIAN} ".\licens\it\licence.rtf"
LicenseLangString mylicense ${LANG_CZECH} ".\licens\cz\licence.rtf"
LicenseLangString mylicense ${LANG_POLISH} ".\licens\pl\licence.rtf"
LicenseLangString mylicense ${LANG_SPANISH} ".\licens\es\licence.rtf"

Либо все файлы в одной папке:
LicenseLangString mylicense ${LANG_ENGLISH} ".\licens\licence_en.rtf"
При этом, изменяем название файлов соответственно: licence_en.rtf, licence_ro.rtf и т.д.
И прописываем эту строку для каждого языка отдельно, все аналогично как и в примере выше.

И следом, прописываем:
!insertmacro MUI_RESERVEFILE_LANGDLL

Затем, по всему вашему коду, все тексты созданные вами и отображаемые программой для юзера, нужно оформить примерно по такой схеме:
LangString TextWelcomePage ${LANG_ENGLISH} "The Setup Wizard will guide you through the installation process of $(^Name).\r\n\r\nIt is strongly recommended to close all other applications before continuing the installation procedure.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_ROMANIAN} "Vei fi ghidat in procesul de instalare al $(^Name).\r\n\r\nEste recomandat sa inchideti celelalte aplicatii pornite inainte sa continuati instalarea.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_GERMAN} "Dieser Assistent führt Sie durch die Installation von $(^Name).\r\n\r\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_RUSSIAN} "Этот мастер проведёт Вас через процесс инсталляции $(^Name).\r\n\r\nРекомендуется закрыть перед инсталляцией все другие программы.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_ITALIAN} "Il Setup Wizard ti guiderà attraverso il processo d'installazione di $(^Name).\r\n\r\nÈ fortemente raccomandato di chiudere tutte le altre applicazioni attive prima di proseguire con l'installazione.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_CZECH} "Setup Wizard vás provede procesem instalace $(^Name).\r\n\r\nJe silně doporučeno zavřít všechny ostatní aplikace, než budete pokračovat v instalaci.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_POLISH} "Kreator instalacji poprowadzi cię przez proces instalacji $(^Name).\r\n\r\nZdecydowanie zaleca się zamknięcie wszystkich innych aplikacji przed kontynuacją instalacji.\r\n\r\n$_CLICK"
LangString TextWelcomePage ${LANG_SPANISH} "El asistente de instalación le guiará a través del proceso de instalación de $(^Name).\r\n\r\nIt es muy recomendable cerrar todas las aplicaciones antes de continuar con el procedimiento de instalación.\r\n\r\n$_CLICK"

В конце кода, прописываем:
в функцию .onInit
!insertmacro MUI_LANGDLL_DISPLAY

в функцию un.onInit
!insertmacro MUI_UNGETLANGUAGE


При запуске инсталлера будет окошко с выбором языка, при деинсталле язык автоматом будет определяться, а все тексты в инсталлере при инсталляции/деинсталляции будут на указанном юзером языке.. Все.


Мои вопросы:
- обойден ли лимит в 2ГБ?
- исправлен ли косяк с иконкой и свойствами файла, при размере инсталлера больше ~350 МБ?


Спасибо.. ,)

MaGoth
05-08-2014, 02:10
K.A.V.

Попробовал твой пример "Проигрывание WAV-файлов" у себя, ничего не вышло..

Загнал его в .onInit
...
!define SND_ASYNC 1
!define SND_FILENAME 0x20000
!define SND_LOOP 8
!define SND_NAME "InstallTheme.wav"

ReserveFile "${NSISDIR}\Plugins\system.dll"
SetOutPath "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground"
ReserveFile "${SND_NAME}"
File "${SND_NAME}"

System::Call 'Winmm::PlaySound(t"$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\${SND_NAME}", i0, i${SND_FILENAME}|${SND_ASYNC}|${SND_LOOP})'
...

Под юникодом и из другой директории, оно работает вообще ?!

K.A.V.
05-08-2014, 17:55
Попробовал твой пример "Проигрывание WAV-файлов" у себя, ничего не вышло.. »
Win2000
WinXP 32-bit
Win7 32/64-bit
Win8 32-bit

На всех системах у меня работает данный метод, проигрывает файлы из любой директории
Насчет юникода ничего не скажу
Может, в пути у вас ошибка или формат WAV файла не тот?

MaGoth
05-08-2014, 21:53
K.A.V.

На всех системах у меня работает данный метод, проигрывает файлы из любой директории
Насчет юникода ничего не скажу
Очень плохо :(

Может, в пути у вас ошибка или формат WAV файла не тот?
Путь 100% рабочий, другое дело годится ли все это для данной функции в Юнике ?!

Как пример, для Юникода и файлов *.mp3 и их воспроизведения, я использую такой код:

Function .onInit
Push $R0
SetCurInstType 0
!insertmacro MUI_LANGDLL_DISPLAY
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "setup.ini"
StrCpy $1 ${SecMod}
;--------------------------------
!define APP_NAME "mci.sound"
!define SND_NAME "InstallTheme.mp3"
;--------------------------------
ReserveFile "${NSISDIR}\Plugins\system.dll"
SetOutPath "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground"
ReserveFile "${SND_NAME}"
File "${SND_NAME}"
System::Call 'msvfw32.dll::MCIWndCreateW(i 0, i 0,i 0x0070, t "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\${SND_NAME}") i .r0'
StrCpy $hmci $0
SendMessage $hmci 0x0490 0 0 $0
IntCmp $0 0 Keine_Musik
ShowWindow $hmci SW_HIDE
SendMessage $hmci 0x806 0 "STR:play repeat"
Keine_Musik:
...
FunctionEnd
И все работает, единственная проблема зацикливание под Юникодом не срабатывает, до сих пор не нашел способа как побороть...

А что с форматом, и каким он должен быть?
В справке ничего не указано на этот счет, я использую "DVI IMA ADPCM", а нужен "RAW PCM", или еще какой ?! :unsure:

habib2302
06-08-2014, 13:51
Доброе время суток. Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL?

MKN
06-08-2014, 17:56
Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL? »
Имеется ввиду код скрипта ? - Нет. Предпринимаются правда попытки... Например, http://nsis.sourceforge.net/NullsoftDecompiler

K.A.V.
06-08-2014, 17:57
Под юникодом »
Вызывайте PlaySoundW,а не PlaySound

Насчет формата файла точно не скажу, уже не помню, тестировал я или нет, но данной командой пользуюсь в SFX Creator для проигрывания звуков
Пример моего WAV файла во вложении, попробуйте его проверить.
Система без проблем у вас? Драйвера все установлены? Потому как я указал, тестировал на виртуалке во многих системах и нигде проблем не возникло

Доброе время суток. Можно ли как нибудь узнать какие команды который прописаны в инсталляторе. например регистрация DLL? »
Шапку читаем

habib2302
06-08-2014, 19:41
Шапку читаем »
конкретней

MaGoth
06-08-2014, 22:21
habib2302,

▫ Чем я могу распаковать инсталлятор, созданный в NSIS?
В настоящее время инсталляторы NSIS не могут быть полностью декомпилированы. Сам инсталлятор не содержит в себе никаких функций для того, чтобы извлечь сценарий и/или файлы без инсталляции. Это - выбор разработчика, доступны ли исходный текст и/или файлы для инсталлятора для публики или нет. Есть, однако, внешние инструментальные средства, которые позволяют это сделать. 7-zip поддерживает частичную распаковку NSIS инсталляторов с алгоритмом сжатия lzma или bzip. Так же существует мульти-архивный плагин для TotalCommander.
Небольшая заметка для разработчиков: используйте DCryptDll, если хотите скрыть некоторые файлы в вашей инсталляции.


K.A.V.,

Система без проблем у вас? Драйвера все установлены? Потому как я указал, тестировал на виртуалке во многих системах и нигде проблем не возникло.
Естественно, не чайник же...

Насчет формата файла точно не скажу, уже не помню, тестировал я или нет, но данной командой пользуюсь в SFX Creator для проигрывания звуков
Пример моего WAV файла во вложении, попробуйте его проверить.
Архив со звуком сравнил, у меня аналогичный формат саунда что и у вас, - "DVI IMA ADPCM", но скорее всего проиграется любой вав..

Вызывайте PlaySoundW,а не PlaySound
С ним и вызывал под юником, - но не работало, пока не поменял кавычки местами, одинарные внутрь.
И.. музыка играет.., :yahoo: но не долго..! :angry2:

Пока исполнение когда не дойдет до закрытия сплеша:
newadvsplash::show 3500 1500 1500 ffffff "$TEMP\${MOD_NAME_BASE} Installation2\bgi_ground\Splash.bmp"
После выполнения этого коды вместе с ним вырубается и музыка ?! :o
Соответственно вопрос, есть ли какой другой метод/способ кроме спуска функции воспроизведения звука, ниже кода этого сплеша? Или может какой аналогичный сплеш по-новее есть, но без подобных глюков ? :sorry:

Спасибо.. ,)

K.A.V.
07-08-2014, 21:12
Соответственно вопрос, есть ли какой другой метод/способ кроме спуска функции воспроизведения звука, ниже кода этого сплеша? Или может какой аналогичный сплеш по-новее есть, но без подобных глюков ? »
Как вариант можно заюзать внешнее консольное приложение для проигрывания аудио, например sounder.exe (http://www.elifulkerson.com/projects/commandline-wav-player.php) (30 Кб), сам не тестил, т.к. лень и хочется спать
В своё время для сборки контры я использовал mpg123.exe для проигрывания mp3 файла сразу после запуска установщика, но там вес файла был ~350 Кб




© OSzone.net 2001-2012