Показать полную графическую версию : .: NSIS - все вопросы :. часть 2.
icq99999999,
перед созданием ярлыка, нужно создать папку ярлыка, иначе ярлык может не создаваться:
CreateDirectory "$SMPROGRAMS\mod"
CreateShortCut "$SMPROGRAMS\mod\mod.lnk" "$INSTDIR\mod.exe"
а так нет?
RMDir /r /REBOOTOK "$SMPROGRAMS\mod" »
потому что должно быть так:
SetOutPath "$SMPROGRAMS\"
RMDir /r /REBOOTOK "$SMPROGRAMS\mod"
пишу
CreateShortCut "$SMPROGRAMS\очистка.lnk" "$INSTDIR\mod.exe" "/O"
получаю ярлык с таким именем
Тихая.lnk"
в чём причина? »
если ты создаешь Unicode установщик, то файл скрипта должен быть в формате UTF-16LE, если ANSI, то ANSI
icq99999999
25-10-2013, 11:20
нужно распознать значение из ini
то есть в ini в секции Setting параметр (I)D будет значение например $EXEDIR
вытяну значение
ReadINIStr $1 "$INSTDIR\mod.ini" "Setting" "(I)D"
но в переменную $1 будет скопировано сам текст $EXEDIR
а мне нужно чтоб а но распознавалось и вместо текста $EXEDIR был путь exe
ну то есть
!include "FileFunc.nsh"
SetCompressor /SOLID lzma
OutFile "e.exe"
SilentInstall silent
Section "MainSection" SEC01
ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
MessageBox MB_OK "вы запустили exe из $1"
SectionEnd
как итог будет сообщение с текстом "вы запустили exe из $EXEDIR"
а мне нужно чтоб был путь exe то есть например сообщение с текстом: "вы запустили exe из С:\1.exe"
icq99999999, не знаете команду сравнения строк?
Прочтите сначала Справочник по NSIS (http://forum.oszone.net/thread-168287.html)
Section "MainSection" SEC01
ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
StrCmp $1 "$$EXEDIR" 0 +2
MessageBox MB_OK "вы запустили exe из $EXEDIR"
SectionEnd
alexfinik
25-10-2013, 13:21
K.A.V., Первую часть читал. Сидел ночью часа полтора и построчно "проходил" код, записывал как изменяются переменные. Забавно. Как ни странно Код заработал с первого раза после проверки. Выложу ради интереса кусок. Правда "завести" массивы так и не вышло. Пока не разобрался почему, но, в любом случае, массивы тут нафиг не нужны оказались/
Function nsRkeeperIni
;!insertmacro var_message
${if} $NumCash > 0
Goto CreateTest0
${endif}
${IpPortMid_ar->Init}
${MID_ar->Init}
${RefServerMid_ar->Init}
${IPMidSrv_ar->Init}
${Station_ar->Init}
StrCpy $ini ".ini"
StrCpy $R6 "1"
StrCpy $R7 "1"
;!insertmacro var_message
StrCpy $NumMid "4"
StartTest0:
StrCpy $NumMidFlag "1" ;флаг входа в цикл NumMid
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Создаем Rkeeper.ini - Введите параметры ресторана ниже"
Pop $Label1
${NSD_CreateLabel} 0 13u 100% 12u "Имя кассового сервера:"
Pop $Label2
${NSD_CreateText} 0 25u 100% 13u "TEST_MIDSERVER" ;задаем имя клиента
Pop $MID
${NSD_CreateLabel} 0 38u 100% 12u "Кассовый сервер подсоединяестся к серверу:"
Pop $Label3
${NSD_CreateText} 0 50u 100% 13u "TEST_RK7SRV" ;задаем имя сервера к которому подсоединяемся
Pop $RefServerMid
${NSD_CreateLabel} 0 63u 100% 12u "IP-адрес и порт"
Pop $Label4
${NSD_CreateText} 0 75u 100% 13u "127.0.0.1:3669" ;
Pop $IpPortMid
${NSD_CreateLabel} 0 88u 100% 12u "Количество касс на данном кассовом сервере (1..50)"
Pop $Label25
${NSD_CreateText} 0 100u 100% 13u "1" ;
Pop $NumCash
;IntOp $R5 $NumCash -1
;MessageBox MB_OK "NumCash=$NumCash $\n MID=$MID $\n IpPortMid=$IpPortMid"
;!insertmacro var_message
;Задаем количество касс на кассовом сервере
;StrCpy $Num1 $NumCash ;зачем-то надо копировать. С Numcash не работает
nsDialogs::Show
${if} $R6 <= $NumMid
${andif} $NumCash == 0
Goto FinishTest0
${endif}
CreateTest0:
${if} $NumCash > 0
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Создаем wincash.ini - введите параметры кассовой станции"
Pop $Label8
${NSD_CreateLabel} 0 13u 100% 12u "Имя кассовой станции:"
Pop $Label9
${NSD_CreateText} 0 25u 100% 13u "TEST_ST01" ;задаем имя кассовой станции
Pop $Station
${NSD_CreateLabel} 0 38u 100% 12u "IP-адрес кассового сервера:"
Pop $Label10
${NSD_CreateText} 0 50u 100% 13u "127.0.0.1" ;
Pop $IPMidSrv
StrCpy $NumCashFlag "1" ;флаг разрешения входа в цикл NumCash
${endif}
nsDialogs::Show
IntOp $NumCash $NumCash - 1
;MessageBox MB_OK "Уменьшаю NumCash на 1 $\n Теперь NumCash=$NumCash"
FinishTest0:
${If} $NumCash == 0
IntOp $R6 $R6 + 1
;MessageBox MB_OK "Увеличиваю R6 на 1 $\n Теперь R6=$R6 $\n NumCash=$NumCash"
StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash
${endif}
${if} $NumCash > 0
Goto CreateTest0
${endif}
${If} $R6 <= $NumMid
;${andif} $NumCash > 0
Goto StartTest0
${endif}
FunctionEnd
;работа с массивами тут необходима
Function nsRkeeperIniLeave
${if} $NumMidFlag == 1
${NSD_GetText} $NumCash $NumCash
${NSD_GetText} $MID $MID
${NSD_GetText} $RefServerMid $RefServerMid
${NSD_GetText} $IpPortMid $IpPortMid
;${NSD_GetText} $Num1 $Num1
${MID_ar->Write} $R6 "$MID"
${MID_ar->Read} $R2 $R6
${RefServerMid_ar->Write} $R6 "$RefServerMid"
${RefServerMid_ar->Read} $R3 $R6
${IpPortMid_ar->Write} $R6 "$IpPortMid"
${IpPortMid_ar->Read} $R4 $R6
!insertmacro var_message
!insertmacro MakeRkeeperIni
StrCpy $NumMidFlag "0" ;флаг выхода в цикл NumMid
StrCpy $NumCashFlag "0" ;флаг запрета входа в цикл NumCash - в принципе тут лишний
${endif}
${if} $NumCashFlag == 0
${orif} $NumCashFlag == ""
Goto FinishTest1
${endif}
${if} $NumCash < 1
${OrIf} $NumCash > 50
;MessageBox MB_OK "Задано слишком маленькое или большое количество станций $\n либо задано некорректное NumCash=$NumCash $\n $\n R6<NumCash ($R6<$NumCash) $\n Перезапустите инсталлятор"
${else}
;MessageBox MB_OK "На кассовой станции №$R6 $NumCash станций $\n R7=$R7"
${NSD_GetText} $Station $Station
;${NSD_GetText} $RefServer2 $RefServer2
${NSD_GetText} $IPMidSrv $IPMidSrv
${Station_ar->Write} $R7 "$Station"
${Station_ar->Read} $2 $R7
${IPMidSrv_ar->Write} $R7 "$IPMidSrv"
${IPMidSrv_ar->Read} $3 $R7
${NSD_GetText} $2 $2
${NSD_GetText} $3 $3
!insertmacro var_message
!insertmacro WinCashIniBat
IntOp $R7 $R7 + 1
${endif}
/*
${if} $NumCash
${if} $R6 < $NumMid
Goto FinishTest1
${endif}
*/
;;Íå îáÿçàòåëüíî, íî åñëè çàäàòü áóäåò êîííåêòèòüñÿ áûñòðåå, òî æå äëÿ êàññû
;;Èíîãäà íåîáõîäèìî (åñëè íå ïðîõîäÿò broadcast ñîîáùåíèÿ)
;;TEST_RK7SRV=127.0.0.1:3669
;MessageBox MB_OK "Внизу Numcash=$Numcash"
/*
*/
FinishTest1:
FunctionEnd
Форум читал - Ну страниц 50-80, наверное. Интересно:). Не помню, кажется первую часть читал. Некоторые вещи просто сносят крышу и вызывают вопросы "как это работает??", но практически для меня неважны были всё равно.
KAV, жалко ваших потраченных усилий, когда сам разобрался... Но спасибо. У вас способ короче намного, конечно. Пока в код досконально не всматривался. Но я так понимаю, что вы предлагаете перехватить управление кнопкой Next. На будущее возьму на заметку.
Вопрос: для чего вам 2-ая функция в странице?
В макросах вставленных с длинными именами типа rkeeperini и wincashinibat создаются ини-файлы. А в первой функции они задаются. Нерационально вышло грешу этим, но вышло. Чай, прошли времени 3.5" и 5" дискет, чтобы заморачиваться размером кода Офигенно доволен! Отказался от циклов по совету kotkovets в пользу GoTo (по совету KAV).
KAV, жалко ваших потраченных усилий, когда сам разобрался... »
Да ничего страшного, мы здесь чтобы помогать начинающим кодерам, а т.к. видно, что вы сами стараетесь, то лично я вдвойне охотнее помогаю таким как вы :)
Ну, а то, что сами разобрались - это тоже хорошо, голова работает логически, в программировании это очень важно
У вас способ короче намного, конечно. »
С опытом и у вас будут коды короче, главное не лениться и побольше тестировать команды и разные конструкции возможностей NSIS
Но я так понимаю, что вы предлагаете перехватить управление кнопкой Next. На будущее возьму на заметку. »
WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя ;)
Офигенно доволен! »
Мы рады, что смогли помочь :up
Если будут вопросы или проблемы с кодом, спрашивайте, не стесняйтесь :)
alexfinik
25-10-2013, 13:43
icq99999999, Вот с таким mod.ini всё работает
[Setting]
(U)F=Example1
I(D)=Example2
(J)G=Example3
[NETKERN]
;возможные протоколы - nbhdup.dll, SPXSOC.dll
Protocols=.\TCPSOC.dll
[TCPSOC]
LISTEN=0
[TCPDNS]
WinMessage.nsh посмотрите в папке Include, там много интересных команд на управление элементов интерфейса на будущее найдёте для себя »
О да, уже оценил какая красота есть внутри *.nsh.
icq99999999
25-10-2013, 14:27
Код: »
а если в переменную $1 будет скопировано значение которое придёт в голову пользователя например значение будет "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
то есть с начало копирую в переменную
ReadINIStr $1 "$exeDIR\mod.ini" "Setting" "(I)D"
потом
MessageBox MB_OK "$1"
как итог будет
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя"
kotkovets
25-10-2013, 14:32
сообщение с текстом "$PROGRAMFILES\не известное значение пришедшее в голову пользователя"
нужно
сообщение с текстом: "C:\Program Files\не известное значение пришедшее в голову пользователя" »
мозги, как говорят, подключи:
MessageBox MB_OK "$PROGRAMFILES\$1"
icq99999999
25-10-2013, 15:00
Код: »
не знаю пробую объяснит сначала
подхватываю значение
ReadINIStr $0 "$1\mod.ini" "Setting" "(I)Vers"
значение это путь установки который должен показаться в сообщении пользователю
MessageBox MB_OK "$1"
если в ini написано(притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь"
то нужно определить эту переменную и (любой путь) и отправить в сообщении пользователю
то есть например значение в ini
$PROGRAMFILES\Portable
то определить и отправить сообщение "C:\Program Files\Portable"
если любая друга переменная пример
$APPDATA\имя придуманное пользователем
то определить и отправить сообщение "C:\Users\%username%\AppData\Roaming\имя придуманное пользователем"
притом может быть любая переменная nsis($SMPROGRAMS,$APPDATA итд) "$PROGRAMFILES\любой путь" »
Справочник по NSIS (http://forum.oszone.net/thread-168287.html) => Примеры кодов => Работа со строками => StrRep
Делайте по принципу замены всех возможных переменных в прочитываемой строке, пример:
${StrRep} $1 "$1" "$$EXEDIR" "$EXEDIR"
${StrRep} $1 "$1" "$$PROGRAMFILES" "$PROGRAMFILES"
И т.д. со всеми переменными
icq99999999
25-10-2013, 15:33
Код: »
Спасибо :) !
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".
Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".
Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю »
Уважаемый, будьте так любезны начать изучение NSIS с нашего Справочника по NSIS (http://forum.oszone.net/thread-168287.html)
А конкретно по вашему вопросу, в справочнике смотреть по пути: Справочник по NSIS => Перевод справки NSIS => MessageBox
Приходите с хорошим настроением и с прочитанными страничками нашего справочника :)
Как правильно расширить изображение в шапке инсталлятора на всю ширину?
kotkovets
27-10-2013, 23:39
Как правильно расширить изображение в шапке инсталлятора на всю ширину? »
Можно так, рядом со скриптом положить p.bmp размером 497х57 :
!include "MUI2.nsh"
OutFile "Test.exe"
InstallDir "$EXEDIR"
!define MUI_HEADER_TRANSPARENT_TEXT
!define MUI_CUSTOMFUNCTION_GUIINIT GUIInit
!define MUI_UI_HEADERIMAGE_RIGHT
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English
Function GUIInit
InitPluginsDir
File '/ONAME=$PLUGINSDIR\heder.bmp' 'p.bmp'
System::Call 'user32::CreateWindowEx(i, t"STATIC", t, i${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE},i,i,i,i,i$HWNDPARENT,i1500,i,i)i.R1'
System::Call 'user32::SetWindowPos(iR1,i,i,i,i,i,i2)'
${NSD_SetImage} $R1 "$PLUGINSDIR\heder.bmp" $R0
GetDlgItem $R0 $HWNDPARENT 1034
SetCtlColors $R0 "" transparent
GetDlgItem $R0 $HWNDPARENT 1039
System::Call 'user32::DestroyWindow(iR0)'
FunctionEnd
Section
SectionEnd
alexfinik
28-10-2013, 19:00
Друзья, а как можно ли определить номер объекта, создаваемого с помощью
${NSD_CreateText} 0 50u 100% 13u ""
Pop $Text
Хотелось бы сделать примерно так:
GetDlgItem $2 $HWNDPARENT НомерОбъекта$Text
SendMessage $Text2 ${WM_SETTEXT} 0 "STR:$6"
$6 получается с помощью клика по кнопке, выполняющей функцию, включающую следующую строку:
${OpenBox} "Search for a ZIP file" "Zip-file (*.zip)|*.zip||" 1 "$EXEDIR" 3 ${VAR_6}
kotkovets
28-10-2013, 19:23
Друзья, а как можно ли определить номер объекта, создаваемого с помощью
Код:
${NSD_CreateText} 0 50u 100% 13u ""
Pop $Text
Хотелось бы сделать примерно так:
Код:
GetDlgItem $2 $HWNDPARENT НомерОбъекта$Text
SendMessage $Text2 ${WM_SETTEXT} 0 "STR:$6" »
что за глупости вам то, что нужно текст поместить в диалог..? так:
${NSD_SetText} $Text "test"
или прочитать с диалога.. м?
${NSD_GetText} $Text $6
в переменной $6 - текст диалога
alexfinik
28-10-2013, 19:25
что за глупости вам то, что нужно текст поместить в диалог..? так:
Код:
${NSD_SetText} $Text "test" »
О! Целый день искал! Мерси огромное!!!
alexfinik
29-10-2013, 00:56
1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт?
2) Правильно ли я понимаю, что жесткие ссылки можно создавать только из UnTGZ_plug-in (http://nsis.sourceforge.net/UnTGZ_plug-in)?
1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт? »
Таскайте за собой дистрибутив NSIS, "натравливаете" nsi-файл скрипт на makensis.exe и исходник будет компилироваться
Суть вопроса насчет 2-го пункта не понял
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC