Показать полную графическую версию : [архив].: NSIS - все вопросы :.
Вы написали неправильный код
Вот его и исправьте
Вы считаете, что кто-то на форуме является шаманом и вот как вам голословно способен помочь?
Хоть покажите, чё написали, а мы посмотрим и попробуем подсказать
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 который ничего не делает. В этом коде тот же косяк, "<Назад" и "Далее>" действуют одинаково.
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
Доброго времени суток. У меня возник следующий вопрос(заранее прошу прошения, если такая тема уже всплывала)
при создании инсталятора, мне необходимо открыть файл (не 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:
;продолжение скрипта
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 и он будет отмечен.
По второму вопросу. Скорее всего придется сохранять значение в реестре, и про следующем запуске его читать
Ну по первому вопросу, нужно было делать страничку через 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
Спасибо за ответ, попробую.
Может, кто-то подскажет...
Мне необходимо сделать проверку перед инсталляцией на пользователя... если это будет "Администратор" ("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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC