Показать полную графическую версию : [архив].: NSIS - все вопросы :.
kotkovets
27-03-2012, 11:27
MKN, давай полный пример, а то ты меня уже достал своей непонятностью :)
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"
kotkovets,
Это понятно, самое простое для вставки одной кнопки в конец тулбара. А надо вставить кнопку в середину или в начало.
Т.е. надо управлять нумерацией всех остальных параметров других кнопок.
kotkovets
27-03-2012, 12:48
MKN, я тебя уже поставил на правильный путь, если тебе это уже понятно, так почему ты задаешь
А надо вставить кнопку в середину или в начало. »
ты ведь получаешь значение, количество кнопок в $Buttoncount, ты можешь уменьшать на единицу, увеличивать на единицу, складывать и умножать, а writeinistr перепишет все как нужно.
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 класса, ей богу!
kotkovets,
А как же с перезаписью номеров следующих за 1ой кнопкой , параметров остальных кнопок ? Вот что не понятно... Перезаписать надо ведь только нумерацию, но не сами команды "bla...bla...". Или именно так и произойдёт ? Я ведь не заменяю кнопку, а добавляю...
kotkovets
27-03-2012, 14:00
MKN, я уже сказал и показал, вот что мешает прочитать предыдущее значение в переменную, и записать вычитая или отнимая единичку.
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
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
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
Но всё же не даёт мне покоя, как из цикла извлекать значения каждого прохода (в файл ли или в переменные) ? »
Поподробнее...Приведите пример цикла, можно же прибавлять просто к переменной, не? :)
пример цикла »
вот к примеру, упоминавшийся уже :
${for} $1 1 10
MessageBox MB_OK "$1" IDOK
${next}
Каким образом записать последовательность значений отсчёта
а - в файл ?
b - в переменные , где каждое значение (от 1 до 10 в данном примере), "прирощенное" в каждом отсчёте цикла, записывается в свою переменную ? Т.е. небходимы 10 переменных.
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
Существует ли в NSIS ключ, наподобие ключа из InnoSetup /silent, но не /verysilent, чтобы процесс установки не был скрыт, как ключём /S, а шёл автоматически, без возможности отмены, но видимо?
BigBoo, Типы инсталляторов (http://www.oszone.net/2766)
kotkovets скажи пожалуйста, вот на счет описанного тобой плагина InvokeShellVerb Plugin for NSIS и хедера InvokeShellVerb.nsh вот если делать так ${PinToPusk} "$WINDIR\notepad.exe" то название закрепленного ярлыка так и есть notepad.exe как то не эстетично, возможно как то задать иное название?
BigBoo, Типы инсталляторов »Там говорится только о ключе /S и /D, то есть хотите сказать, что кроме этих других ключей не существует?
Там говорится только о ключе /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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC