Как переместить функцию NSD_OnBack из раздела в NSIS - PullRequest
0 голосов
/ 22 января 2019

Я пишу сценарий NSIS, в котором используются некоторые разделы для выполнения EXE-файлов. в зависимости от вывода, мне нужно вернуться из раздела на другие пользовательские страницы, но здесь nsis перемещается в другой раздел, даже сохраняя функцию NSD_OnBack или просто вызывая конкретную функцию

Я попробовал ниже 2 метода. $ {NSD_OnBack} "функция обратного вызова" функция обратного вызова

//Section started
Section "validation" VALIDATION
DetailPrint "Executing Validation"
File "Folder_name\Validation.exe"
nsExec::Exec '"$INSTDIR\Validation.exe" $arg1 $arg2 $arg3'
IfFileExists "$INSTDIR\Output.txt" pass fail
pass:
FileOpen $chk "$INSTDIR\Output.txt" r
FileRead $chk $1
MessageBox MB_OK|MB_ICONSTOP "Validation_Output : in 1 $1"
Push $1
Push "true"
Call StrContains
Pop $3
${If} $3 == "true"
call someotherfunction
${ELSE}
goto fail
${ENDIF}
FileClose $chk
Delete $chk
fail:
MessageBox MB_OK|MB_ICONSTOP "fail"
//Here this call is not working 
${NSD_OnBack} "callbackfunction"
SectionEnd


Function callbackfunction
GetDlgItem $0 $HWNDPARENT 2
${IF} $portalname == "centralised"
${IF} $username == ""
    call CentralisedPage
${ENDIF}
${ELSE}
${IF} $username == ""
    call SetCustom
   ${ENDIF}
${ENDIF}
Functionend

Я ожидаю переместить другую страницу на основе результатов EXE.

1 Ответ

0 голосов
/ 25 января 2019

${NSD_OnBack} - это обратный вызов для пользовательских страниц nsDialogs , и он вызывается, когда пользователь нажимает кнопку возврата на этой странице, он здесь неактуален.

В идеале вы должны собрать всю информацию, прежде чем попасть на страницу InstFiles, но если вы не можете этого сделать, я бы порекомендовал вам просто показать пользовательскую страницу после страницы InstFiles, если это необходимо.

Если вам абсолютно необходимо выполнять разделы несколько раз, вы можете использовать более одной страницы InstFiles:

!include LogicLib.nsh
!include WinMessages.nsh
!include nsDialogs.nsh
!include Sections.nsh
!include MUI2.nsh

!insertmacro MUI_PAGE_COMPONENTS
!define MUI_PAGE_CUSTOMFUNCTION_PRE Init1stStage
!insertmacro MUI_PAGE_INSTFILES
Page Custom MyCustomPageCreate
!define MUI_PAGE_CUSTOMFUNCTION_PRE Init2ndStage
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_LANGUAGE English

Var Needs2ndStage

Section "1st stage" SID_1
DetailPrint "1st stage"
MessageBox mb_yesno "Needs 2nd stage?" IDNO nope
    StrCpy $Needs2ndStage 1
nope:
SectionEnd

Section "-2nd stage" SID_2
DetailPrint "2nd stage"
SectionEnd

Function Init1stStage
!insertmacro UnselectSection ${SID_2}
FunctionEnd

Function Init2ndStage
!insertmacro UnselectSection ${SID_1}
${IfThen} $Needs2ndStage = 0 ${|} Abort ${|}
FunctionEnd

Function MyCustomPageCreate
${IfThen} $Needs2ndStage = 0 ${|} Abort ${|}
!insertmacro SelectSection ${SID_2}
GetDlgItem $0 $hWndParent 1
SendMessage $0 ${WM_SETTEXT} "" "STR:C&ontinue"
GetDlgItem $0 $hWndParent 3
ShowWindow $0 0 ; Hide back
GetDlgItem $0 $hWndParent 2
EnableWindow $0 0 ; Disable cancel
!insertmacro MUI_HEADER_TEXT "Blah" "Blah blah blah"
nsDialogs::Create 1018
Pop $0
${NSD_CreateLabel} 0 0 100% 12u "Enter blah blah before you can enter the 2nd stage"
Pop $0
nsDialogs::Show
FunctionEnd
...