PDA

Показать полную графическую версию : [архив].: NSIS - все вопросы :.


Страниц : 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 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170

kotkovets
24-09-2011, 16:43
обнаружил интересные положительные свойства этого макроса »
какие? эту "апишку" я знаю хорошо, к тому же в справочнике по NSIS, Примеры кодов->Определение SID пользователя,
в макросе я добавил чуть больше возможностей использовать потенциал этой апи функции.

Oleg48
27-09-2011, 19:39
Дорогие товарищи помогите подчистить (подкорректировать, упростить) код:
!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"

var dialog
var pass
var rezul

Function .onInit
${GetOptions} $CMDLINE "/PAS=" $1
IfErrors +3 0
StrCpy $rezul $1
GoTo .Done
FunctionEnd

Page custom fnCustomInit fnCustomDestroy

Function fnCustomInit
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 40% 20% 90u 12u $rezul
Pop $pass
${if} $rezul == ""
nsDialogs::Show
${endif}
FunctionEnd

Function fnCustomDestroy
${NSD_GetText} $pass $rezul
GoTo .Done
FunctionEnd


Section "MainSection" SEC01
.Done:
${ifnot} $rezul == ПАРОЛЬ
MessageBox MB_ICONSTOP "Неверный пароль !!!"
Abort ; конец иницилизации
${endif}
...
SectionEnd
Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде, вот решил его усовершенствовать.
Вашему вниманию представляю часть кода, принцип его работы такой: Запускаем программу. Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит. Если при установке ключ /PAS неуказывается тогда пользователю предлогается ввести пароль в окошке, естественно при правильном пароле программа устанавливается, а при неправильном нет.
Писал этот код почти по наитию, методом проб и ошибок, поэтому строго несудите. Самому неочень нравится переходы на метки, считаю что это неочень правильно но по другому еще пока неумею. Буду рад любой помощи.

kotkovets
28-09-2011, 00:55
Писать скрипты на NSIS начал недавно, чаще всего использовал мастер, почти незадумывался о коде »
Очень плохо, это очень мощный язык сценария, и сложный довольно для начинающих
Если при запуске программы указываем ключ /PAS="пароль" , тогда если пароль правильный программа устанавливается без окна запроса пароля, если пароль неправильный то ничего непроисходит »
Здесь вы упустили очень важный момент, при тихом режиме (с ключом /S) всегда будет установка,
поэтому тоже нужна еще проверка на флаг тихого режима.
неочень нравится переходы на метки, считаю что это неочень правильно »
Дикий код, но пойдет :) , накидал пример на логических конструкциях (на мой взгляд более правильный подход всегда использовать в скриптах, чем голые метки), пример на принципе если пароль неверен
вызываем функцию прерывания установки - просто и эффективно.
!include "FileFunc.nsh"
!include "nsDialogs.nsh"
!include "winmessages.nsh"
!include "logiclib.nsh"

outfile test.exe
var dialog
var pass
var rezul

Page custom fnCustomInit fnCustomDestroy
Page InstFiles ;страничка устаноки

Function .onInit
ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
${GetOptions} $CMDLINE "/PAS=" $rezul
${If} ${Silent} ;функцию проверки пароля, запускаем, если тихий режим И
${AndIf} $rezul != ПАРОЛЬ ;неверный пароль, т.е логика И
Call CheckPass
${EndIf}
ClearErrors ;очищаем принудительно флаг ошибки для корректной отработки кода
FunctionEnd

Function fnCustomInit
${If} $rezul != ПАРОЛЬ ;если ключ правильный, то не показываем кастомную страничку, если не тихий режим.
nsDialogs::Create 1018
Pop $dialog
${NSD_CreateText} 83u 40u 90u 12u $rezul
Pop $pass
nsDialogs::Show
${EndIf}
FunctionEnd

Function fnCustomDestroy
${NSD_GetText} $pass $rezul
${If} $rezul != ПАРОЛЬ
Call CheckPass
${EndIf}
FunctionEnd

Function CheckPass ;функция прерывания
MessageBox MB_ICONSTOP "Неверный пароль !!!"
Abort ; конец иницилизации
FunctionEnd

Section "MainSection" SEC01
MessageBox MB_ICONINFORMATION|MB_OK "$rezul" IDOK
SectionEnd

Impeck
28-09-2011, 08:13
Возникла необходимость в транслитерации.
Имеем в $0 "По умолчанию"
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"

Такое можно сделать в NSIS?

kotkovets
28-09-2011, 10:55
Нужно получить в $0 "Po umolchaniu"
а лучше в $0 "\x41f\x43e \x443\x43c\x43e\x43b\x447\x430\x43d\x438\x44e"
Такое можно сделать в NSIS? »
Можно, на алгоритм сложный(множество циклов, сравнение символов, конвертирование) - нет желания заниматься,
не очень это востребовано и столь часто необходимо.
С помощью плагина Registry (http://nsis.sourceforge.net/Registry_plug-in) можно конвертировать строку в бинарный вид и наоборот.
Полное русское описание плагина вы найдете в справочнике по NSIS, ссылку на справочник найдете в шапке темы

Impeck
28-09-2011, 13:31
kotkovets, спасибо, посмотрел плагин Registry, конвертирует немного не в то чего бы хотелось.

kotkovets
28-09-2011, 14:02
конвертирует немного не в то чего бы хотелось »
Можно разложить строку на символы в цикле, и заменять каждый символ,
Например с помощью команды поддерживающий 256 символов, пример в цикле, число=символ, матрица:
Section
StrCpy $0 0
Go:
Intfmt $1 %c $0 ; в $1 символ соответствующий цифре
DetailPrint "$0 = $1"
InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
StrCmp $0 256 End
Goto Go
End:
SectionEnd

Impeck
29-09-2011, 07:34
Еще вопрос...
большая буква "А"=>"x0410"
маленькая буква "а"=>"x0430"

для
StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"
регистр букв не важен.
Как-то можно это обойти?

kotkovets
29-09-2011, 10:57
регистр букв не важен.
Как-то можно это обойти? »
что обойти, забор, ограждение???

Impeck
29-09-2011, 11:26
забор :)
Как различить регистр букв?

StrCmp $1 "а" 0 +2
StrCpy $1 "\x430"
StrCmp $1 "А" 0 +2
StrCpy $1 "\x410"

в $1 маленькая "а" будет.

kotkovets
29-09-2011, 13:17
Как различить регистр букв? »
StrcmpS
Очередное приближение, как вариант а :drug:
!include "MUI2.nsh"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"
ShowInstDetails show
outfile testing.exe

Var char
Var conv_char
Var stroka_in
Var stroka_out

Section test
;эти команды препроцессора нужны для ускорения работы цикла
;чтобы в цикле не мельтешил прогресс бар!!!
;////////////////////////////
Call :.whilefor_Next
!ifndef whilefor
!define whilefor
Goto .whilefor_End
!endif
.whilefor_Next:
;/////////////////////////////

StrCpy $0 0 ;отсчет от нулевого символа, c 192 символа начинается кирилица
StrCpy $1 206 ;шифрование символа, т.е нулевой символ = \x206, 255символ = \x461

StrCpy `$stroka_in` "абвгд"
StrLen $2 `$stroka_in` ;вычисляем длину входной строки
IntOp $2 $2 - 1
${DoUntil} $2 == -1 ;цикл если нулевая длина строки, то цикл не начнется!!!
Intfmt $char "%c" $0 ; в $char символ соответствующий цифре
Intfmt $conv_char "\x$1" $0 ;конвертируем символ в вид \xYYY
InTop $1 $1 + 1
;-----------------------
;DetailPrint "[Номер символа: $0] -> $char = $conv_char" ;$char - символ строки, $conv_char - конвертированный символ строки
;-----------------------
InTop $0 $0 + 1 ;c каждым циклом увеличиваем на 1 $0
${For} $R1 0 $2
StrCpy $5 '$stroka_in' 1 $R1 ;в цикле разбиваем входную строку на один символ
StrCmps $5 $char 0 +2 ;cравниваем символ учитывая регистр символа, это очень важно!
StrCpy $stroka_out $stroka_out$conv_char
${Next}
${LoopUntil} $0 == 256 ;глобальный цикл на 256 символов строки

;/////////////////////////////
Return
.whilefor_End:
;/////////////////////////////

DetailPrint "Входная строка: $stroka_in"
DetailPrint "Закодированная строка: $stroka_out"
SectionEnd

Impeck
29-09-2011, 14:32
То что нужно, спасибо огромное.

kotkovets
29-09-2011, 14:46
Impeck,
Еще маленькая загвоздка, как известно NSIS хранит в переменной максимум 1024 символа
расширенная версия NSIS хранит максимум 8192 символа
(более подробно почитайте в справочнике по NSIS - > Расширенная версия NSIS
Так вот при конвертировании одного символа - конвертированный символ занимает 5 символов, при превышении максимального
хранения символов входной строки - будет обрезаться, т.е выходная строка будет обрезана до максимума хранения. ${NSIS_MAX_STRLEN}
Здесь очень выгодно использовать расширенную версию NSIS.

punsh
29-09-2011, 21:38
как правильно

SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
SetShellVarContext all
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"

или

SetShellVarContext all
CreateDirectory "$APPDATA\Adobe\"
CopyFiles /SILENT "$EXEDIR\Data\Adobe\*.*" "$APPDATA\Adobe\"

?

kotkovets
29-09-2011, 22:19
как правильно »
Достаточно в один раз прописать в скрипте, чет вы не уверены, проверяйте, а потом вопрос задавайте...

wolkow70
02-10-2011, 14:58
Товарищи, есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7?

sawe
02-10-2011, 15:32
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7 »
Переведи или объясни в какое место этой панели

wolkow70
02-10-2011, 15:35
Переведи или объясни в какое место этой панели »
Куда помещаются ярлыки программ, место можно крайнее справа...


В Inno примерно так пишется (подсмотел в скрипте):

Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\PotPlayer"; Filename: "{app}\PotPlayerMini.exe"; WorkingDir: "{app}"; Check: "MakeQuickLaunchIcon"; BeforeInstall: "PinToTaskband ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\PotPlayer.lnk')"; MinVersion: 0.0,6.01;

kotkovets
02-10-2011, 16:09
есть ли комманда автоматически поместить ярлык программы на панель задач для windows 7? »
http://forum.oszone.net/post-1307991-2.html
#помещаем ярлык к блокноту
Exec `wscript.exe PinToTasckbar.vbs "$WINDIR\notepad.exe"`
#если нужно удалить ярлык, запускаем еще раз

wolkow70
02-10-2011, 16:18
kotkovets,
Других вариантов нет, без VBS?




© OSzone.net 2001-2012