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
27-03-2012, 11:27
MKN, давай полный пример, а то ты меня уже достал своей непонятностью :)

MKN
27-03-2012, 11:36
kotkovets,
Да, чувствую что достал... Но кроме тебя, никто на белом свете, не откликается так развёрнуто, с помощью по NSIS заморочкам... :)
Задача такая - в файле Default.bar, в котором определяется расположение и содержание кнопок на тулбаре в ТotalCommаnder_e :

[Buttonbar]
Buttoncount=5
button1=%COMMANDER_PATH%\WCMICONS.DLL,15
cmd1=%COMMANDER_PATH%\Bar2.bar
iconic1=0
button2=
iconic2=0
button3=%COMMANDER_PATH%\Dop\TCPlugman\Plugman.exe
cmd3=%COMMANDER_PATH%\Dop\TCPlugman\Plugman.exe
path3=%COMMANDER_PATH%\Dop\TCPlugman\
iconic3=0
menu3=Plugman
button4=%COMMANDER_PATH%\Dop\myuninst\myuninst.exe
cmd4=%COMMANDER_PATH%\Dop\myuninst\myuninst.exe
path4=%COMMANDER_PATH%\Dop\myuninst\
iconic4=0
menu4=myuninst
button5=wcmicons.dll,79
cmd5=cm_SwitchHidSys
iconic5=0


необходимо при добавлении новой кнопки в произвольное место, прописать её парметры с присвоенной нумерацией и перенумеровать параметры имеющихся кнопок, относительно вставленной новой кнопки.

Например, вставляем кнопку первой на тулбар. Следовательно бывшая первая кнопка станет второй , вторая третьей и т.д. Такая же нумерация со смещением в + единицу, будет и укаждого параметра этих кнопок.
Параметров для разных кнопок может быть от 2 до 5.

kotkovets
27-03-2012, 12:32
MKN, насколько я понял:

var Buttoncount

ClearErrors
ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"
ClearErrors
IntOp $Buttoncount $Buttoncount + 1
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount" "$Buttoncount"

WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$Buttoncount" "%COMMANDER_PATH%\WCMICONS.DLL,15"
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$Buttoncount" "%COMMANDER_PATH%\Bar2.bar"
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$Buttoncount" "%COMMANDER_PATH%\Bar2.bar"
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$Buttoncount" "path"
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$Buttoncount" "Plugman"

MKN
27-03-2012, 12:41
kotkovets,
Это понятно, самое простое для вставки одной кнопки в конец тулбара. А надо вставить кнопку в середину или в начало.
Т.е. надо управлять нумерацией всех остальных параметров других кнопок.

kotkovets
27-03-2012, 12:48
MKN, я тебя уже поставил на правильный путь, если тебе это уже понятно, так почему ты задаешь
А надо вставить кнопку в середину или в начало. »
ты ведь получаешь значение, количество кнопок в $Buttoncount, ты можешь уменьшать на единицу, увеличивать на единицу, складывать и умножать, а writeinistr перепишет все как нужно.

MKN
27-03-2012, 12:50
kotkovets,
Приведи пожалуйста пример для вставки первой кнопки.

kotkovets
27-03-2012, 13:14
Приведи пожалуйста пример для вставки первой кнопки. »
для вставки изменения 3 кнопки:
ClearErrors
ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"
ClearErrors
IntOp $0 $Buttoncount - 3
IntOp $1 $Buttoncount - $0
${If} $1 == 3
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$1" "bla...bla..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$1" "bla...bla..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$1" "bla...bla..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$1" "bla...bla..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$1" "bla...bla..."
${EndIf}
допустим у нас 11 кнопок в $Buttoncount, нам нужно изменить 3 кнопку,
следовательно, 11-3=9, находим разницу между 11 и 9 = 3, ну ставим условие только 3 кнопка
математика 3 класса, ей богу!

MKN
27-03-2012, 13:23
kotkovets,
А как же с перезаписью номеров следующих за 1ой кнопкой , параметров остальных кнопок ? Вот что не понятно... Перезаписать надо ведь только нумерацию, но не сами команды "bla...bla...". Или именно так и произойдёт ? Я ведь не заменяю кнопку, а добавляю...

kotkovets
27-03-2012, 14:00
MKN, я уже сказал и показал, вот что мешает прочитать предыдущее значение в переменную, и записать вычитая или отнимая единичку.

K.A.V.
27-03-2012, 14:42
MKN
Как-то так...



Function SortInINI_Section
var /Global NumToAdd
var /Global Buttoncount
StrCpy $NumToAdd "3" ; Какой порядковый номер добавляем
ReadIniStr $Buttoncount "$EXEDIR\Default.bar" "Buttonbar" "Buttoncount"

StrCmp $NumToAdd "1" 0 +3 ; Если добавляем 1-ый пункт, то это сделает функция FirstAdd
call FirstAdd
goto end
StrCmp $NumToAdd "$Buttoncount" 0 +3
call EndAdd ; Если добавляем последний, то это сделает функция EndAdd
goto end

; Здесь идёт код, который добавляет ваш пункт в середину
CopyFiles /silent "$EXEDIR\Default.bar" "$EXEDIR\tmp.bar" ; Копируем файл, чтобы сохранить предыдущие пункты и не перетасовывать их
IntOp $0 $NumToAdd - 1
StrCpy $1 $NumToAdd
start:
IntOp $0 $0 + 1
IntOp $1 $1 + 1

clearerrors
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
IfErrors endFunc
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$1" "$3"
goto start
endFunc:

; Добавляемый пункт, за место ... вставляем добавляемые данные
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$NumToAdd" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$NumToAdd" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$NumToAdd" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$NumToAdd" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$NumToAdd" "..."
Delete "$EXEDIR\Default.bar"
Rename "$EXEDIR\tmp.bar" "$EXEDIR\Default.bar"
end:
FunctionEnd




Function FirstAdd
; Добавляемый пункт, за место ... вставляем добавляемые данные
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button1" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd1" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic1" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path1" "..."
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu1" "..."
StrCpy $0 0
start:
IntOp $0 $0 + 1
StrCmp $0 "1" 0 +3
StrCpy $1 2
goto +2
IntOp $1 $1 + 1
clearerrors
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
IfErrors endFunc
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\tmp.bar" "Buttonbar" "menu$1" "$3"
goto start
endFunc:
Delete "$EXEDIR\Default.bar"
Rename "$EXEDIR\tmp.bar" "$EXEDIR\Default.bar"
FunctionEnd



Function EndAdd
StrCpy $0 $NumToAdd
IntOp $1 $NumToAdd + 1
; Уберите строку StrCmp $3 "" +2 0 чтобы записывать пустые значения
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "button$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "cmd$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "iconic$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "path$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$1" "$3"
ReadINIStr $3 "$EXEDIR\Default.bar" "Buttonbar" "menu$0"
StrCmp $3 "" +2 0
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$1" "$3"

; Добавляемый пункт, за место ... вставляем добавляемые данные
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "button$0" "..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "cmd$0" "..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "iconic$0" "..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "path$0" "..."
WriteIniStr "$EXEDIR\Default.bar" "Buttonbar" "menu$0" "..."
FunctionEnd

MKN
27-03-2012, 15:21
kotkovets, K.A.V., - спасибо за помощь и терпение... :)

Но всё же не даёт мне покоя, как из цикла извлекать значения каждого прохода (в файл ли или в переменные) ?
В поисках информации, которой нет, наткнулся на такой код :

Программа, выводящая песню о пиве (beer.nsi) ; Beer song. Written by Evgeny Stepanischev
Дело конечно не в песне, а в наглядности возможностей NSIS. Так вот - возможно ли из такого рода кода извлечь текст песни не DetailPrint_ом, а в обычный файл ? Как это сделать ?


Caption "Beer song"
OutFile "beer99.exe"
BrandingText "Beer song (Evgeny Stepanischev)"
ShowInstDetails show

!macro c
StrCpy $2 ""
Call PrintBeer
!macroend

Function PrintBeer
IntCmp $1 0 no "" ""
StrCpy $2 "$2$1"
Goto +2
no:
StrCpy $2 "$2No"
StrCpy $2 "$2 bottle"
IntCmp $1 1 nos "" ""
StrCpy $2 "$2s"
nos:
StrCpy $2 "$2 of beer"
FunctionEnd

Section ""
StrCpy $1 99

loop:
!insertmacro c
StrCpy $2 "$2 on the wall, "
Call PrintBeer
DetailPrint "$2."
DetailPrint "Take one and pass around,"
IntOp $1 $1 - 1

!insertmacro c
DetailPrint "$2 on the wall."
DetailPrint ""
IntCmp $1 0 "" loop loop

DetailPrint "No more bottles of beer..."
DetailPrint "Go to the store and buy some more..."
DetailPrint "99 bottles of beer."

SectionEnd

K.A.V.
27-03-2012, 16:18
MKN, что мешает заменить команду DetailPrint командой FileWrite?



Function .onInit
FileOpen $R0 "$EXEDIR\kav_song.txt" w
FileWrite $R0 "$\n$\r"
call test
FileClose $R0
quit
FunctionEnd

!macro c
StrCpy $2 ""
Call PrintBeer
!macroend

Function PrintBeer
IntCmp $1 0 no "" ""
StrCpy $2 "$2$1"
Goto +2
no:
StrCpy $2 "$2No"
StrCpy $2 "$2 bottle"
IntCmp $1 1 nos "" ""
StrCpy $2 "$2s"
nos:
StrCpy $2 "$2 of beer"
FunctionEnd

Function test
StrCpy $1 99

loop:
!insertmacro c
StrCpy $2 "$2 on the wall, "
Call PrintBeer
FileWrite $R0 "$\n$2."
FileWrite $R0 "$\nTake one and pass around,"
IntOp $1 $1 - 1

!insertmacro c
FileWrite $R0 "$\n$2 on the wall."
FileWrite $R0 "$\n"
IntCmp $1 0 "" loop loop

FileWrite $R0 "$\nNo more bottles of beer..."
FileWrite $R0 "$\nGo to the store and buy some more..."
FileWrite $R0 "$\n99 bottles of beer."

FunctionEnd



Но всё же не даёт мне покоя, как из цикла извлекать значения каждого прохода (в файл ли или в переменные) ? »
Поподробнее...Приведите пример цикла, можно же прибавлять просто к переменной, не? :)

MKN
27-03-2012, 16:24
пример цикла »
вот к примеру, упоминавшийся уже :
${for} $1 1 10
MessageBox MB_OK "$1" IDOK
${next}
Каким образом записать последовательность значений отсчёта
а - в файл ?
b - в переменные , где каждое значение (от 1 до 10 в данном примере), "прирощенное" в каждом отсчёте цикла, записывается в свою переменную ? Т.е. небходимы 10 переменных.

K.A.V.
27-03-2012, 16:50
MKN
а - в файл, либо методом WriteINIStr, чтобы сохранить значение каждого цыкла в разный параметр
Либо из примера б запишите одной строкой и возьмите как указано в том же примере


${for} $1 1 10
WriteINIStr "$TEMP\test.ini" "test" "test" "Цикл №$1" "Значение цикла"
MessageBox MB_OK "$1" IDOK
${next}



Или насчет б я бы зделал так:
Создал переменную, и в ней уже проделывал все манипуляции
Скажем, создал переменную и могу хранить в ней значение 10 других "переменных"


Function .onInit
var /global MyVar
StrCpy $MyVar "/1=0 /2=0 /3=0 /4=0 /5=0 /6=0 /7=0 /8=0 /9=0 /10=0"
; Заполним "переменные нулевыми значениями, чтобы потом можно было их заменить"

call test

${for} $1 1 10
${GetOptions} "$MyVar" "/$1=" $R0
; Здесь мы получаем значение каждой "переменной"
MessageBox MB_OK "/$1=$R0" IDOK
${next}

quit
FunctionEnd


Function test
${for} $1 1 10

${GetOptions} "$MyVar" "/$1=" $R0
intop $2 $1 + 10
${StrRep} $MyVar "$MyVar" "/$1=$R0" "/$1=$2"
; Заменяем в нашей переменной значение каждой "подпеременной" плюсуя к значению 10

MessageBox MB_OK "/$1=$R0" IDOK
${next}

FunctionEnd

BigBoo
28-03-2012, 19:10
Существует ли в NSIS ключ, наподобие ключа из InnoSetup /silent, но не /verysilent, чтобы процесс установки не был скрыт, как ключём /S, а шёл автоматически, без возможности отмены, но видимо?

alert30
28-03-2012, 20:37
BigBoo, Типы инсталляторов (http://www.oszone.net/2766)

diakov
28-03-2012, 20:43
kotkovets скажи пожалуйста, вот на счет описанного тобой плагина InvokeShellVerb Plugin for NSIS и хедера InvokeShellVerb.nsh вот если делать так ${PinToPusk} "$WINDIR\notepad.exe" то название закрепленного ярлыка так и есть notepad.exe как то не эстетично, возможно как то задать иное название?

BigBoo
28-03-2012, 20:54
BigBoo, Типы инсталляторов »Там говорится только о ключе /S и /D, то есть хотите сказать, что кроме этих других ключей не существует?

alert30
28-03-2012, 21:01
Там говорится только о ключе /S и /D, то есть хотите сказать, что кроме этих других ключей не существует? »
Других ключей больше нету. Попробуйте погуглить и Вы увидите те же самые ключи /S /D.

kotkovets
28-03-2012, 21:40
Существует ли в NSIS ключ, наподобие ключа из InnoSetup /silent, но не /verysilent, чтобы процесс установки не был скрыт, как ключём /S, а шёл автоматически, без возможности отмены, но видимо? »
не существует, но легко их сделать самому, и применить свойство прыжкам по страничкам.
!include "MUI2.nsh"
!include "FileFunc.nsh"

!define MUI_CUSTOMFUNCTION_GUIINIT MUIGUIInit
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE "Russian"

OutFile "proga.exe"
ShowInstDetails show

InstallDir $EXEDIR
var vSilent

Function MUIGUIInit
ClearErrors
${GetOptions} "$CMDLINE" "/silent" $R0
StrCpy $vSilent 0
IfErrors +3
StrCpy $vSilent 1
SendMessage $HWNDPARENT 0x408 3 0 ;прыжок на 3 страничку установки.
FunctionEnd


Section "install_section"
MessageBox MB_ICONINFORMATION|MB_OK "$INSTDIR" IDOK
SectionEnd


Section
StrCmp $vSilent 1 0 +2
Quit
SectionEnd
Запуск с ключом /silent - заставляет установщик перенестись на страничку установки.
Почему на 3 страничку, стандартных страничек приветствия и финиша в нсис нет!, значит их не учитываем,
остается только по скрипту 3 странички:
1 выбор директории
2 выбор компонентов
3 страничка установки - на страничку эту и ведем счет.
создаем "последнюю" секцию по скрипту, что бы не показывалась страничка финиша.
kotkovets скажи пожалуйста, вот на счет описанного тобой плагина InvokeShellVerb Plugin for NSIS и хедера InvokeShellVerb.nsh вот если делать так ${PinToPusk} "$WINDIR\notepad.exe" то название закрепленного ярлыка так и есть notepad.exe как то не эстетично, возможно как то задать иное название? »
создай ярлык с нужным названием, а затем плаг натравливай на ярлык и будет тебе счастье.




© OSzone.net 2001-2012