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

agrei678
17-08-2018, 17:28
Begin2Fly, Это вы знаменитый KpoJIuK, а не могли бы вы выставить скрипт, а-то в nsis ни когда не делал

Insofts
07-10-2018, 18:23
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

Salmo
11-11-2018, 00:49
Добрый день. Можно ли в NSIS определить выделенный файл (в фокусе), чтобы продолжить работать, именно, с ним?

MKN
13-11-2018, 13:45
определить выделенный файл (в фокусе) »
Что под этим подразумевается ? (подробнее, последовательность действий и задача)

Salmo
13-11-2018, 14:47
Что под этим подразумевается ? » MKN, спасибо за отклик. Так и знал, что техническое косноязычие помешает...
У меня в цикле в фоне отрабатывает код. Нужно в него вставить функцию, которая обнаруживает выделенный курсором любой файл в любом месте (как это делает винда) и сбрасывает путь к файлу в переменную. Диалоговые окна не нужны, файл заранее не определен, важен факт его выделения кликом.

MKN
13-11-2018, 15:53
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


(этот код можешь добавить в код своей функции или как угодно...)

Наверняка можно "ловить" клик по файлу и иначе, но это уже программирование иного уровня...

Salmo
13-11-2018, 18:43
MKN, спасибо! Буду думать над вариантом с контекстным меню, если "левый" клик отловить не так просто.

Flix
18-11-2018, 12:18
Salmo, MKN, в проводнике Windows есть стандартная функция "Копировать как путь". Нужно зажать клавишу SHIFT и щелкнуть по файлу правой кнопкой мыши. В контекстном меню будет доступна команда "Копировать как путь".

MKN
20-11-2018, 09:58
в проводнике Windows есть стандартная функция "Копировать как путь" »
В поставленной задаче было необходимо занести путь "выделенно-кликнутого" файла в переменную NSIS, для дальнейшего использования в коде.

Salmo
23-11-2018, 16:28
Flix, MKN, добрый день, я вижу есть некое продолжение моей темы. Я решил задачу, отказавшись от цикла, а код теперь запускается так:

!include "FileFunc.nsh"

Function .onInit
${GetParameters} $R0
ClearErrors
${GetOptions} $R0 "/A" $0
MessageBox MB_OK "$0" ;проверка
FunctionEnd

"Натаскиваю" файл на ярлык ЕХЕ_шника, отрабатывает код и в переменную $0 сбрасывается путь к файлу. Такой вариант меня вполне устраивает.

Serg866
14-12-2018, 09:17
Привет
Нужна функция, определяющая, что инсталлятор был запущен из rar-архива, и в зависимости от этого выполнять определённый код. Подскажите, друзья, как мне такое реализовать?
Я понимаю, что при запуске из архива, файл инсталлятора распаковывается во временную папку и уже оттуда самозапускается. Но определить, что установщик был запакован в архив всё равно нужно.

MKN
14-12-2018, 10:18
Нужна функция, определяющая, что инсталлятор был запущен из 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.

Serg866
14-12-2018, 11:04
MKN, к сожалению про сигнатуры я ничего не понял...


При запуске инсталлятора из rar-архива, происходит распаковка во временную папку, и уже из неё инсталлятор автоматически запускается в обычном виде.

Путь к временной папке, в которую распаковывается инсталлятор:
C:\Documents and Settings\Серж\Local Settings\Temp\Rar$EXa0.XXX (вместо XXX - три случайные цифры)
Вот думаю, надо привлекать сюда команду $EXEDIR, определять путь запуска и если в пути присутствует слово "temp" или "rar$", то выполнять определённый код. Меня бы такой вариант устроил. Буду благодарен за пример кода по данному сценарию.

MKN
14-12-2018, 11:35
Serg866,
Т.е. ты сначала запускаешь SFX RAR, из которого в свою очередь запускается NSIS инсталлятор ?
А NSIS инсталлятор после запуска определяет откуда он появился на свет ? Если из RAR архива, то...
Тогда, раз известны некоторые данные в названии временного файла, можно с этим файлом работать,т.е. узнать RAR это архив или нет.
Я правильно понял ? Сигнатура тогда и нужна, для того, чтобы точно определить, какой это файл.
(Хотя в темпе ведь уже может быть непредсказуемый винегрет из кучи разных файлов с непредсказуемыми названиями, в том числе и с "temp" или "rar... Тут и сигнатура не поможет. :) Разве что сначала придётся очищать темп или детектить последнее время создания временного архивного файла... )

ps Зачем такие извращения ? И антивирусы сойдут с ума от такой матрёшки... :)

Serg866
14-12-2018, 12:19
MKN, мне только этого будет достаточно:
1. Определяется путь запуска инсталлятора ($EXEDIR)
2. Если в $EXEDIR есть слово "rar"или "temp", то мессаджбокс и аборт установки.
Ничего вычищать из папок не требуется.


Недобросовестные персонажи упаковывают мою программу в winrar-архив, куда также кладут url-файлы ссылок на свои уг-сайты и ещё кучу всякого "добра".
И потом в таком виде на этих сайтах мою программу распространяют против моей воли.

Я хочу, чтобы программа определяла, что для запуска использован архив и прекращала установку.

Iska
14-12-2018, 13:02
Serg866, пожалуйста, не делайте так. Это плохая практика, ибо есть ещё и добросовестные персонажи.

Flix
14-12-2018, 14:13
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 инсталлятор при запуске активно задействует временный каталог.

MKN
14-12-2018, 15:11
Поиск подстроки "temp" использовать не рекомендую »
Да и поиск в пути подстроки Rar тоже может подвести... Сочетание Rar запросто может входить в имя пользователя...
\Documents and Settings\Raritet\Local Settings\Temp\Rar$EXa0.XXX

Flix
14-12-2018, 19:04
Сочетание Rar запросто может входить в имя пользователя... »
Абсолютно верное замечание. Я привел всего лишь простейший пример, который можно доработать, предусмотрев возможные коллизии. :)

MKN
15-12-2018, 09:15
Flix,
Интересно, как долго висит процесс SFX модуля ? Если процесс ещё существует во время запуска NSIS инсталлятора, то это был бы очень хороший ориентир для детекта... Хорошо бы посмотреть, как работает, "оприходованный" пиратами, инсталлятор Serg866. :)




© OSzone.net 2001-2012