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

hb860
17-07-2010, 20:20
Вы написали неправильный код
Вот его и исправьте
Вы считаете, что кто-то на форуме является шаманом и вот как вам голословно способен помочь?
Хоть покажите, чё написали, а мы посмотрим и попробуем подсказать

Krinkels
17-07-2010, 20:36
Делал на основе этого кода:
ReInstall.ini:
[Settings]
NumFields=3
[Field 1]
Type=Label
Left=0
Right=-1
Top=0
Bottom=24
Text=MyProg is already installed. Select the operation you want to perform and click Next to continue.
[Field 2]
Type=RadioButton
Left=30
Right=-1
Top=50
Bottom=58
State=1
Text=Reinstall MyProg
[Field 3]
Type=RadioButton
Left=30
Right=-1
Top=70
Bottom=78
Text=Uninstall MyProg

reinstall.nsi:
!include "MUI.nsh"

!define MUI_ABORTWARNING

;!!!!!!!!!!!!!!!
InstallDirRegKey HKLM "Software\Antaris\TestReInstall" "Install_Dir"
Name "TestReInstall"
OutFile "TestReInstall.exe"
InstallDir "$PROGRAMFILES\MyNSISTest\TestReInstall"

!insertmacro MUI_PAGE_WELCOME
Page custom PageReinstall
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"

ReserveFile "ReInstall.ini"
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

Function .onInit
!insertmacro MUI_INSTALLOPTIONS_EXTRACT "ReInstall.ini"
FunctionEnd

Section Files
SetOutPath "$INSTDIR"
;File "1.exe"
SectionEnd

Section -Post
;!!!!!!!!!!!!!!!
WriteRegStr HKLM "Software\Antaris\TestReInstall" "Install_Dir" "$INSTDIR"
WriteUninstaller "$INSTDIR\uninstall.exe"
SectionEnd

Function PageReinstall
!insertmacro MUI_HEADER_TEXT "Already Installed" "Choose the maintenance option to perform."
ReadRegStr $R0 HKLM "Software\Antaris\TestReInstall" "Install_Dir"
StrCmp $R0 "" 0 +2
Abort
StrCpy $R0 "2"

!insertmacro MUI_INSTALLOPTIONS_DISPLAY "ReInstall.ini"
!insertmacro MUI_INSTALLOPTIONS_READ $R1 "ReInstall.ini" "Field 2" "State"
StrCmp $R0 "1" 0 +1
StrCmp $R0 "2" 0 +2
StrCmp $R1 "1" reinst_done
ExecWait '$INSTDIR\uninstall.exe'
Quit
reinst_done:
FunctionEnd

Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely remove MyProg?" IDYES +2
Abort
FunctionEnd

Section Uninstall
Delete "$INSTDIR\1.exe"
Delete "$INSTDIR\uninstall.exe"
RMDir "$INSTDIR"
DeleteRegKey HKLM "Software\Antaris\TestReInstall"
SectionEnd.
Просто добавил лишний RadioButton который ничего не делает. В этом коде тот же косяк, "<Назад" и "Далее>" действуют одинаково.

hb860
18-07-2010, 01:33
Page custom [creator_function] [leave_function]
У вас написано
Page custom PageReinstall
т.е. одна функция на всё. Я полагаю, дело в этом
Попробуйте
Page custom PageIn PageReinstall
function PageIn оставьте без кода

Krinkels
18-07-2010, 12:35
hb860
Попробуйте
Код:
Page custom PageIn PageReinstall
function PageIn оставьте без кода »
Если так поставить то страница вообще не появляется

WolfSoul
18-07-2010, 19:46
Используя ваш пример «Создание собственных страниц инсталлятора», вот сделал такую страничку.
Пример кода:

;-Создание собственной страницы инсталлятора (страница "Выбор установки ключа регистрации"), начало функций
Var Dialog1
Var GroupBox
Var RadioButtonA
Var RadioButtonB
Var RadioButtonC

Function fnCustomInit2
!insertmacro MUI_HEADER_TEXT "Вабор регистрационого ключа для Total Commander 6.55" "Выбирите из предлогаемого списка один из ключей"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Регистрационные ключи для Total Commander 6.55:"
Pop $GroupBox

${NSD_CreateRadioButton} 10 18u 70% 10% "Browseup Ltd"
Pop $RadioButtonA

${NSD_CreateRadioButton} 10 30u 70% 10% "CNRS IRIT-UMR 5505"
Pop $RadioButtonB

${NSD_CreateRadioButton} 10 42u 70% 10% "COMVERSE CNS"
Pop $RadioButtonC

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd
;-Конец функций


В ней пользователь должен выбрать один из предлагаемых трёх элементов.
Всё работает лишь тогда когда прописывается путь полностью…
Пример кода:

Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File "..\Setups\TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd


Я пробовал изменить код, ну чтобы не прописывать путь к файлу полностью…
Пример кода 1:
Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File /r "TotalCmd\Browseup Ltd\WinCmd.key"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File /r "TotalCmd\CNRS IRIT-UMR 5505\WinCmd.key"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File /r "TotalCmd\COMVERSE CNS\WinCmd.key"
SkipC:
FunctionEnd

или
Пример кода 2:
Function fnCustomDestroy2
${NSD_GetState} $RadioButtonA $R0
StrCmp $R0 1 0 SkipA
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipA:

${NSD_GetState} $RadioButtonB $R0
StrCmp $R0 1 0 SkipB
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipB:

${NSD_GetState} $RadioButtonC $R0
StrCmp $R0 1 0 SkipC
SetOutPath "$INSTDIR"
File /r "TotalCmd\*.key*"
SkipC:
FunctionEnd

Но так не срабатывает.
ВОПРОС
Как сделать, чтобы не прописывать путь к файлу полностью?

kotkovets
19-07-2010, 02:51
Как сделать, чтобы не прописывать путь к файлу полностью? »

Так:
File /r "TotalCmd\*.*"

или так:
File /r "TotalCmd\*.key"

Скрипт должен находится на одном уровне с папкой TotalCmd

Sauron3
19-07-2010, 18:50
Доброго времени суток. У меня возник следующий вопрос(заранее прошу прошения, если такая тема уже всплывала)
при создании инсталятора, мне необходимо открыть файл (не exe) дождаться чтобы пользователь проделал с ним какие-либо операции? закрыл этот файл и только потом установка продолжилась. Открываю файл с помощью ExecShell "open", он открывается, но установка продолжается. Команада ExecWait не помогает.
Заранее Спасибо.

kotkovets
19-07-2010, 22:30
мне необходимо открыть файл (не exe) дождаться, чтобы пользователь проделал с ним какие-либо операции, закрыл этот файл и только потом установка продолжилась »

Можно так:
ExecWait 'notepad "Путь к файлу.txt"'
или так:
ExecShell "open" "Путь к файлу.txt"
MessageBox MB_ICONQUESTION|MB_YESNO "Вы сделали все? продолжим?" IDNO NO IDYES YES
NO:
Quit
YES:
;продолжение скрипта

Sauron3
20-07-2010, 09:24
Спасибо!

WolfSoul
21-07-2010, 01:27
http://img375.imageshack.us/img375/9665/nsis02.png
Спасибо вам за ранее оказанную помощь в написание данного кода.
Подскажите, пожалуйста, как сделать CheckBox активным в самодельном окне?
И как сделать, чтобы запоминался выбор пользователя?
Пример кода:
;-Создание собственной страницы инсталлятора (страница "Ярлыки и автозагрузка"), начало функций
Var Dialog
Var CheckBoxSM
Var CheckBoxD
Var CheckBoxQL
Var CheckBoxA
Var GroupBox1
Var GroupBox2

Function fnCustomInit1
!insertmacro MUI_HEADER_TEXT "Выбирите допольнительные задачи" "Какие дополнительные задачи необходимо выполнить?"
nsDialogs::Create 1018
Pop $Dialog

${NSD_CreateGroupBox} 0 5% 100% 50% "Ярлыки программы:"
Pop $GroupBox1

${NSD_CreateCheckBox} 10 18u 70% 10% "В меню Пуск"
Pop $CheckBoxSM

${NSD_CreateCheckBox} 10 30u 70% 10% "На рабочем столе"
Pop $CheckBoxD

${NSD_CreateCheckBox} 10 42u 70% 10% "В панели быстрого запуска"
Pop $CheckBoxQL

${NSD_CreateGroupBox} 0 -25% 100% 25% "Запуск программы вместе с системой:"
Pop $GroupBox2

${NSD_CreateCheckBox} 10 -22u 70% 10% "Добавить программу в автозапуск"
Pop $CheckBoxA

nsDialogs::Show
FunctionEnd

Function fnCustomDestroy1
${NSD_GetState} $CheckBoxSM $R0
StrCmp $R0 1 0 SkipSM
CreateDirectory "$SMPROGRAMS\AudioGrabber"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Help.lnk" "$INSTDIR\AudioGrabber.hlp" "" "" "" "" "" "Помощь!!!"
CreateShortCut "$SMPROGRAMS\AudioGrabber\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" "" "" "" "" "" "Посетить сайт автора -> AudioGrabber"
CreateShortCut "$SMPROGRAMS\AudioGrabber\Uninstall.lnk" "$INSTDIR\Uninstall.exe" "" "" "" "" "" "Удалить -> AudioGrabber с Вашей системы"
SkipSM:

${NSD_GetState} $CheckBoxD $R0
StrCmp $R0 1 0 SkipD
CreateShortCut "$DESKTOP\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SkipD:

${NSD_GetState} $CheckBoxQL $R0
StrCmp $R0 1 0 SkipQL
CreateShortCut "$QUICKLAUNCH\AudioGrabber.lnk" "$INSTDIR\AudioGrabber.exe" "" "" "" "" "" "AudioGrabber 1.83.0.1"
SkipQL:

${NSD_GetState} $CheckBoxA $R0
StrCmp $R0 1 0 SkipA
WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Run" "AudioGrabber" "$INSTDIR\AudioGrabber.exe"
SkipA:
FunctionEnd
;-Конец функций

Krinkels
21-07-2010, 11:17
WolfSoul
Ну по первому вопросу, нужно было делать страничку через ini, там все проще делается. В ini в параметрах чекбокса можно поставить State=1 и он будет отмечен.
По второму вопросу. Скорее всего придется сохранять значение в реестре, и про следующем запуске его читать

hb860
21-07-2010, 17:06
Ну по первому вопросу, нужно было делать страничку через ini, там все проще делается. В ini в параметрах чекбокса можно поставить State=1 и он будет отмечен. »
Кажому своё. Мне проще через модуль nsDialogs. И Вы так и не ответили человеку на вопрос.

WolfSoul, чтобы отметить флажок изначально, в INIT-функции (fnCustomInit1) напишите в конце
${NSD_SetText} $CheckBoxSM 1

И как сделать, чтобы запоминался выбор пользователя? »
Запоминался где? Уточните, я не совсем понял о чем вы.

Krinkels
22-07-2010, 08:22
hb860
И Вы так и не ответили человеку на вопрос. »
Потому что я не знал как можно такое реализовать.

И как сделать, чтобы запоминался выбор пользователя? »
Он скорее всего имеет ввиду чекбоксы, запомнить отмечен или нет. Ну а если нет то телепаты в отпуске

WolfSoul
22-07-2010, 21:30
hb860
Большое спасибо за ответ!
Лично мне он очень пригодился.

И как сделать, чтобы запоминался выбор пользователя?

Этот вопрос отпадает, не к чему это.

WolfSoul
22-07-2010, 21:58
Можно ли в NSIS реализовать вот такое окно с background
Как сделать background я знаю, а как поставить надпись не пойму.
Нужна надпись в нижнем правом углу как на этой картинки.
http://img199.imageshack.us/img199/1264/sshot20100722213221.jpg

kotkovets
23-07-2010, 13:44
Можно ли в NSIS реализовать вот такое окно с background »
Посмотри пример в папке Examples\BgImage



Name "BgImage.dll test"
OutFile "BgImage.exe"
XPStyle on
ShowInstDetails show

!define DEBUG
!macro GetReturnValue
!ifdef DEBUG
Pop $R9
StrCmp $R9 success +2
DetailPrint "Error: $R9"
!endif
!macroend

Function .onGUIInit
!ifdef DEBUG
BgImage::SetReturn on
!endif
BgImage::SetBg /GRADIENT 0 0x80 0 0x80 0 0
!insertmacro GetReturnValue
CreateFont $R0 "Tahoma" 17 700 ;шрифт
BgImage::AddText "Testing 1... 2... 3..." $R0 0 0 255 790 720 1024 768 ;(R G B) (координаты текста - x;y) (разрешение экрана - X;Y)
!insertmacro GetReturnValue
BgImage::Redraw
FunctionEnd

Function .onGUIEnd
BgImage::Destroy
FunctionEnd

Section
SectionEnd

WolfSoul
23-07-2010, 14:02
Спасибо за ответ, попробую.

Lisabon
23-07-2010, 23:42
Может, кто-то подскажет...

Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ . Если можно привести пример. Заранее спасибо...

kotkovets
24-07-2010, 13:49
Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("Admin"), то папка установки c:\Program Files\Программа\ , а если "Пользователь" ("User") - с ограниченными правами, то папка установки c:\Программа\ »


!include "LogicLib.nsh"
!include "FileFunc.nsh"

var SYSDRIVE

SilentInstall Silent
OutFile "Test.exe"

!macro IsUserAdmin RESULT
!define Index "Line${__LINE__}"
StrCpy ${RESULT} 0
System::Call '*(&i1 0,&i4 0,&i1 5)i.r0'
System::Call 'advapi32::AllocateAndInitializeSid(i r0,i 2,i 32,i 544,i 0,i 0,i 0,i 0,i 0, \
i 0,*i .R0)i.r5'
System::Free $0
System::Call 'advapi32::CheckTokenMembership(i n,i R0,*i .R1)i.r5'
StrCmp $5 0 ${Index}_Error
StrCpy ${RESULT} $R1
Goto ${Index}_End
${Index}_Error:
StrCpy ${RESULT} -1
${Index}_End:
System::Call 'advapi32::FreeSid(i R0)i.r5'
!undef Index
!macroend

Function .onInit
!insertmacro IsUserAdmin $R0
FunctionEnd

Section
; с правами администратора
${If} $R0 == 1
MessageBox MB_OK "$PROGRAMFILES\Программа"
${EndIf}
; c ограниченной учеткой
${If} $R0 == 0
StrCpy $SYSDRIVE $WINDIR 2
MessageBox MB_OK "$SYSDRIVE\Программа"
${EndIf}
SectionEnd

maximum142
25-07-2010, 14:55
Всем привет подскажите начинающему в NSIS хочу добавить информацию с помощью экзешника в oeminfo.ini
прописываю так

WriteINIStr $SYSDIR\Oeminfo.ini Support Information "Line1=--"


но при компиляции выходит так

WriteINIStr: [Support] Information=Line1=-- in $SYSDIR\Oeminfo.ini


подскажите как надо прописать чтобы на выходе в Oeminfo.ini получилось так

[Support Information]
Line1=--




© OSzone.net 2001-2012