Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
agrei678
17-08-2018, 17:28
Begin2Fly, Это вы знаменитый KpoJIuK, а не могли бы вы выставить скрипт, а-то в nsis ни когда не делал
Nsis Script Creator Это простой текстовый редактор, с функцией быстрой разработки простых NSIS скриптов.
Ссылка на страницу программы: http://www.insofts.ru/Nsis_Script_Creator.html
http://www.insofts.ru/upload/nsc/Nsis_Script_Creator_1.png
http://www.insofts.ru/upload/nsc/Nsis_Script_Creator_2.png
http://www.insofts.ru/upload/nsc/Nsis_Script_Creator_3.png
Добрый день. Можно ли в NSIS определить выделенный файл (в фокусе), чтобы продолжить работать, именно, с ним?
определить выделенный файл (в фокусе) »
Что под этим подразумевается ? (подробнее, последовательность действий и задача)
Что под этим подразумевается ? » MKN, спасибо за отклик. Так и знал, что техническое косноязычие помешает...
У меня в цикле в фоне отрабатывает код. Нужно в него вставить функцию, которая обнаруживает выделенный курсором любой файл в любом месте (как это делает винда) и сбрасывает путь к файлу в переменную. Диалоговые окна не нужны, файл заранее не определен, важен факт его выделения кликом.
Salmo,
Самое простое, кликнуть правой кнопкой мыши по любому файлу и в появившемся контекстном меню кликнуть по нужному пункту, который сам и создашь.
код , как создать такой пункт :
OutFile "FilePatchMyFunction.exe"
RequestExecutionLevel admin
Section
SetShellVarContext all
WriteRegStr HKEY_CLASSES_ROOT "*\Shell\FilePatchMyFunction" "" ""
WriteRegStr HKEY_CLASSES_ROOT "*\Shell\FilePatchMyFunction\command" "" "$TEMP\MyFunction.exe /A $\"%1$\""
;WriteRegStr HKCR "*\Shell\FilePatchMyFunction" "icon" "$icoPatch\my.ico"
SectionEnd
В этом примере пункт назван "FilePatchMyFunction"
Обрабатывается клик командой "$TEMP\MyFunction.exe /A $\"%1$\"
MyFunction.exe(помещаемую, как пример, в $TEMP), где определяется путь из переменной, получаем так :
outfile "MyFunction.exe"
!include "FileFunc.nsh"
RequestExecutionLevel admin
Function .onInit
${GetParameters} $R0
ClearErrors
${GetOptions} $R0 "/A" $0
MessageBox MB_OK "$0"
FunctionEnd
Section
SetAutoClose true
SectionEnd
(этот код можешь добавить в код своей функции или как угодно...)
Наверняка можно "ловить" клик по файлу и иначе, но это уже программирование иного уровня...
MKN, спасибо! Буду думать над вариантом с контекстным меню, если "левый" клик отловить не так просто.
Salmo, MKN, в проводнике Windows есть стандартная функция "Копировать как путь". Нужно зажать клавишу SHIFT и щелкнуть по файлу правой кнопкой мыши. В контекстном меню будет доступна команда "Копировать как путь".
в проводнике Windows есть стандартная функция "Копировать как путь" »
В поставленной задаче было необходимо занести путь "выделенно-кликнутого" файла в переменную NSIS, для дальнейшего использования в коде.
Flix, MKN, добрый день, я вижу есть некое продолжение моей темы. Я решил задачу, отказавшись от цикла, а код теперь запускается так:
!include "FileFunc.nsh"
Function .onInit
${GetParameters} $R0
ClearErrors
${GetOptions} $R0 "/A" $0
MessageBox MB_OK "$0" ;проверка
FunctionEnd
"Натаскиваю" файл на ярлык ЕХЕ_шника, отрабатывает код и в переменную $0 сбрасывается путь к файлу. Такой вариант меня вполне устраивает.
Привет
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива, и в зависимости от этого выполнять определённый код. Подскажите, друзья, как мне такое реализовать?
Я понимаю, что при запуске из архива, файл инсталлятора распаковывается во временную папку и уже оттуда самозапускается. Но определить, что установщик был запакован в архив всё равно нужно.
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива »
Детектишь сигнатуру архива. В теме уже было. Основные сигнатуры известны.
К примеру, сигнатура WinRAR compressed archive(v4.x) - 52 61 72 21 1A 07 00
Конкретнее есть здесь : https://www.rarlab.com/technote.htm
RAR 5.0 signature consists of 8 bytes: 0x52 0x61 0x72 0x21 0x1A 0x07 0x01 0x00. You need to search for this signature in supposed archive from beginning and up to maximum SFX module size. Just for comparison this is RAR 4.x 7 byte length signature: 0x52 0x61 0x72 0x21 0x1A 0x07 0x00.
MKN, к сожалению про сигнатуры я ничего не понял...
При запуске инсталлятора из rar-архива, происходит распаковка во временную папку, и уже из неё инсталлятор автоматически запускается в обычном виде.
Путь к временной папке, в которую распаковывается инсталлятор:
C:\Documents and Settings\Серж\Local Settings\Temp\Rar$EXa0.XXX (вместо XXX - три случайные цифры)
Вот думаю, надо привлекать сюда команду $EXEDIR, определять путь запуска и если в пути присутствует слово "temp" или "rar$", то выполнять определённый код. Меня бы такой вариант устроил. Буду благодарен за пример кода по данному сценарию.
Serg866,
Т.е. ты сначала запускаешь SFX RAR, из которого в свою очередь запускается NSIS инсталлятор ?
А NSIS инсталлятор после запуска определяет откуда он появился на свет ? Если из RAR архива, то...
Тогда, раз известны некоторые данные в названии временного файла, можно с этим файлом работать,т.е. узнать RAR это архив или нет.
Я правильно понял ? Сигнатура тогда и нужна, для того, чтобы точно определить, какой это файл.
(Хотя в темпе ведь уже может быть непредсказуемый винегрет из кучи разных файлов с непредсказуемыми названиями, в том числе и с "temp" или "rar... Тут и сигнатура не поможет. :) Разве что сначала придётся очищать темп или детектить последнее время создания временного архивного файла... )
ps Зачем такие извращения ? И антивирусы сойдут с ума от такой матрёшки... :)
MKN, мне только этого будет достаточно:
1. Определяется путь запуска инсталлятора ($EXEDIR)
2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки.
Ничего вычищать из папок не требуется.
Недобросовестные персонажи упаковывают мою программу в winrar-архив, куда также кладут url-файлы ссылок на свои уг-сайты и ещё кучу всякого "добра".
И потом в таком виде на этих сайтах мою программу распространяют против моей воли.
Я хочу, чтобы программа определяла, что для запуска использован архив и прекращала установку.
Serg866, пожалуйста, не делайте так. Это плохая практика, ибо есть ещё и добросовестные персонажи.
2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки. »
Для поиска подстроки в указанной строке можно воспользоваться функцией StrContains (https://nsis.sourceforge.io/StrContains).
Подключите код функции к вашему сценарию и в функции инициализации добавьте следующий код (текст сообщения измените в соответствии с вашими пожеланиями):
Function .onInit
; В строке пути $EXEDIR ищем подстроку Rar, результат поиска записываем в регистр $0
${StrContains} $0 "Rar" "$EXEDIR"
; Если в регистре $0 содержится подстрока "Rar", то...
${If} $0 == "Rar"
; Выводим на экран сообщение
MessageBox MB_ICONEXCLAMATION|MB_OK "Вы используете нелегальную копию."
; Завершаем работу инсталлятора
Quit
${EndIf}
; другие инструкции функции
FunctionEndПоиск подстроки "temp" использовать не рекомендую, т.к. любой NSIS инсталлятор при запуске активно задействует временный каталог.
Поиск подстроки "temp" использовать не рекомендую »
Да и поиск в пути подстроки Rar тоже может подвести... Сочетание Rar запросто может входить в имя пользователя...
\Documents and Settings\Raritet\Local Settings\Temp\Rar$EXa0.XXX
Сочетание Rar запросто может входить в имя пользователя... »
Абсолютно верное замечание. Я привел всего лишь простейший пример, который можно доработать, предусмотрев возможные коллизии. :)
Flix,
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, то это был бы очень хороший ориентир для детекта... Хорошо бы посмотреть, как работает, "оприходованный" пиратами, инсталлятор Serg866. :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC