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

vahe-91
25-10-2013, 09:39
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"

K.A.V.
25-10-2013, 11:53
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).

K.A.V.
25-10-2013, 13:39
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\имя придуманное пользователем"

K.A.V.
25-10-2013, 15:13
притом может быть любая переменная 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
Код: »
Спасибо :) !

YoraG
27-10-2013, 16:21
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".

Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю

K.A.V.
27-10-2013, 18:53
Помогите пожалуйста с Uninstall. Как мне сделать при запуске uninst.exe выдать сообщение с кнопками ОК, Отмена и текстом: "Внимание! Вместе с программой будет удалена ваша база. Продолжить?".
Кажется нужно использовать
MessageBox MB_OKCANCEL "Внимание! Вместе с программой будет удалена ваша база. Продолжить?"
а как не знаю »
Уважаемый, будьте так любезны начать изучение NSIS с нашего Справочника по NSIS (http://forum.oszone.net/thread-168287.html)
А конкретно по вашему вопросу, в справочнике смотреть по пути: Справочник по NSIS => Перевод справки NSIS => MessageBox

Приходите с хорошим настроением и с прочитанными страничками нашего справочника :)

Awral
27-10-2013, 22:51
Как правильно расширить изображение в шапке инсталлятора на всю ширину?

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)?

K.A.V.
29-10-2013, 11:03
1) Dозможно ли сгенерировать exe-файл на борту. Т.е. есть ли возможность включения встроенного компилятора NSIS в скрипт? »
Таскайте за собой дистрибутив NSIS, "натравливаете" nsi-файл скрипт на makensis.exe и исходник будет компилироваться

Суть вопроса насчет 2-го пункта не понял




© OSzone.net 2001-2012