繁体   English   中英

为什么当我添加自定义 nsDialog 页面时,我的 NSIS 脚本似乎跳过了 MUI_PAGE_INSTFILES 等安装页面?

[英]Why does my NSIS script appear to be skipping over installation pages like MUI_PAGE_INSTFILES when I add custom nsDialog pages?

这是我最新的 NSIS 安装脚本,它已经成长为一个野兽。

https://pastebin.com/eSABLLsi

我的问题是,如何将HW_DATA_DIRHW_WORKSPACE_DIR以及可能的%HEADWAVE_ROOT_DIR%的所有部分放入一个页面中? 我猜我必须以某种方式使用nsDialog 我的主管希望我这样做,因为有很多单独的安装页面,您必须在其中不断单击并单击太多次才能完成安装。

我尝试了以下方法,但是在 function 中添加nsDialogPage custom HeadwaveConfiguration似乎不太适合程序流程。 这是我的代码修改:

Var headwaveConfigDialog
Var headwaveConfigDataDirLabel
Var headwaveConfigDataDirText
Var headwaveConfigWkDirLabel
Var headwaveConfigWkDirText

!define MUI_PAGE_CUSTOMFUNCTION_PRE SelectFilesCheck
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!insertmacro MUI_PAGE_COMPONENTS

## This is the title on the Headwave Data Directory page
;!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
;!define MUI_PAGE_HEADER_TEXT "Headwave configuration"
; !define MUI_PAGE_HEADER_SUBTEXT "Select the folder which Headwave can use as a data storage."
Page custom HeadwaveConfiguration

; ; HW Data 
; !define MUI_PAGE_CUSTOMFUNCTION_PRE hw_data_pre
; !define MUI_PAGE_CUSTOMFUNCTION_SHOW hw_data_dir
; !define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
; !insertmacro MUI_PAGE_DIRECTORY

; ## This is the title on the Headwave Workspace Directory page
; !define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW_WK)"
; !define MUI_PAGE_HEADER_TEXT "Choose Headwave Workspace directory"
; !define MUI_PAGE_HEADER_SUBTEXT "Select the folder which Headwave can use as a workspace."

; # HW Workspaces
; !define MUI_PAGE_CUSTOMFUNCTION_PRE hw_wk_pre
; !define MUI_PAGE_CUSTOMFUNCTION_SHOW hw_wk_dir 
; !define MUI_DIRECTORYPAGE_VARIABLE $HW_WORKSPACE_DIR
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES    
 
## This is the title on the Headwave installation Directory page to obtain directory for %HEADWAVE_ROOT_DIR
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW_INST)"
!define MUI_PAGE_HEADER_TEXT "Choose Headwave Plugin installation directory"
!define MUI_PAGE_HEADER_SUBTEXT "Select the folder where Headwave is presently installed to set environment variable."
 
!define MUI_PAGE_CUSTOMFUNCTION_PRE SelectFilesHeadwaveProg
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

; ...

Function HeadwaveConfiguration
  !insertmacro MUI_HEADER_TEXT "Headwave configuration" "Select the respective folders for Headwave."
  nsDialogs::Create 1018
  Pop $headwaveConfigDialog

  ${NSD_CreateLabel} 0 0 100% 12u "Select the folder which Headwave can use as a data storage:"
  Pop $headwaveConfigDataDirLabel
       
  ${NSD_CreateText} 10% 20u 80% 12u "C:\HW-Data"
  Pop $headwaveConfigDataDirText
  StrCpy $HW_DATA_DIR $headwaveConfigDataDirText   
  
  ${NSD_CreateLabel} 0 40u 80% 12u "Select the folder which Headwave can use as a workspace:"
  Pop $headwaveConfigWkDirLabel

  ${NSD_CreateText} 10% 60u 80% 12u "C:\HW-Workspaces"
  Pop $headwaveConfigWkDirText
  StrCpy $HW_WORKSPACE_DIR $headwaveConfigWkDirText        

  ;${NSD_CreateLabel} 0 80u 80% 12u "Select the folder where Headwave is installed:"
  ;Pop $headwaveConfigProgramDirLabel

  ;StrCpy $headwaveConfigProgramDirText $HeadwaveInstallDir
  ;${NSD_CreateText} 10% 100u 80% 12u $HeadwaveInstallDir
  ;Pop $headwaveConfigProgramDirText
  ;StrCpy $HeadwaveInstallDir $headwaveConfigProgramDirText           

  ;MessageBox MB_OK 'HeadwaveConfiguration: HeadwaveInstallDir = $HeadwaveInstallDir; headwaveConfigProgramDirText = $headwaveConfigProgramDirText'

  SetCtlColors $headwaveConfigHwnd 0xFF0000 0xFFFFFF
  
  nsDialogs::Show        
FunctionEnd

但问题是HeadwaveConfiguration nsDialog页面被调用以获取HW_DATA_DIRHW_WORKSPACE_DIR ,但随后它只是跳转开始安装MyApp而不是首先安装 Headwave 组件然后继续安装MyApp

有没有人有什么建议? TIA。

更新:

这是我更新代码的方式,但在跳转到 MyApp 安装页面之前它仍然没有安装 Headwave 组件:

!define MUI_PAGE_CUSTOMFUNCTION_PRE SelectFilesCheck
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ComponentsLeave
!insertmacro MUI_PAGE_COMPONENTS

## This is the title on the Headwave Data Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"
!define MUI_PAGE_HEADER_TEXT "Headwave configuration"
!define MUI_PAGE_CUSTOMFUNCTION_PRE HeadwaveConfigurationPre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW HeadwaveConfigurationShow
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES    
 
## This is the title on the Headwave installation Directory page to obtain directory for %HEADWAVE_ROOT_DIR%
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW_INST)"
!define MUI_PAGE_HEADER_TEXT "Choose Headwave Plugin installation directory"
!define MUI_PAGE_HEADER_SUBTEXT "Select the folder where Headwave is presently installed to set environment variable."

Function HeadwaveConfigurationPre
  !insertmacro MUI_HEADER_TEXT "Headwave configuration" "Select the respective folders for Headwave."
  nsDialogs::Create 1018
  Pop $headwaveConfigDialog

  ${NSD_CreateLabel} 0 0 100% 12u "Select the folder which Headwave can use as a data storage:"
  Pop $headwaveConfigDataDirLabel
       
  ${NSD_CreateText} 10% 20u 80% 12u "C:\HW-Data"
  Pop $headwaveConfigDataDirText
  StrCpy $HwDataDir $headwaveConfigDataDirText   
  
  ${NSD_CreateLabel} 0 40u 80% 12u "Select the folder which Headwave can use as a workspace:"
  Pop $headwaveConfigWkDirLabel

  ${NSD_CreateText} 10% 60u 80% 12u "C:\HW-Workspaces"
  Pop $headwaveConfigWkDirText
  StrCpy $HwWorkspaceDir $headwaveConfigWkDirText        

  ;${NSD_CreateLabel} 0 80u 80% 12u "Select the folder where Headwave is installed:"
  ;Pop $headwaveConfigProgramDirLabel

  ;StrCpy $headwaveConfigProgramDirText $HeadwaveInstallDir
  ;${NSD_CreateText} 10% 100u 80% 12u $HeadwaveInstallDir
  ;Pop $headwaveConfigProgramDirText
  ;StrCpy $HeadwaveInstallDir $headwaveConfigProgramDirText           

  SetCtlColors $headwaveConfigHwnd 0xFF0000 0xFFFFFF
  
  nsDialogs::Show        
FunctionEnd
 
Function HeadwaveConfigurationShow
    MessageBox MB_OK 'HeadwaveConfiguration: HeadwaveInstallDir = $HeadwaveInstallDir; headwaveConfigProgramDirText = $headwaveConfigProgramDirText'        
FunctionEnd

## Section 1
Section "MyPartnerApp Plugin" SEC1
  MessageBox MB_OK 'Headwave Plugin #1: INSTDIR = $INSTDIR'
  ${If} ${SectionIsSelected} ${SEC1}    
    ${StrContains} $0 "MyPartnerApp" "$INSTDIR" 
    StrCmp $0 "" notfoundMyPartnerApp
    Goto doneMyPartnerApp
    doneMyPartnerApp:
      MessageBox MB_OK 'Headwave Plugin #2: HW_DATA_DIR = $HW_DATA_DIR'
      SetOutPath "$HW_DATA_DIR"
      ${StrContains} $0 "Data" "$HW_DATA_DIR"
      StrCmp $0 "" notfoundHwData
      Goto doneHwData
      ;MessageBox MB_OK 'Did not find MyApp string'
    doneHwData: 
    
      ##All the files in Group 0 will be installed to the same location, $HW_DATA_DIR
      MessageBox MB_OK 'Headwave Plugin #3: HW_DATA_DIR = $HW_DATA_DIR'
      SetOutPath "$HW_DATA_DIR"
      CreateDirectory "$HW_DATA_DIR"
      CreateDirectory "$HW_DATA_DIR\MyApp-Plugins"
      CreateDirectory "$HW_DATA_DIR\MyApp-Plugins\ComputePlugin"
      CreateDirectory "$HW_DATA_DIR\MyApp-Plugins\ExtensionPlugin"                                       

      File /oname=$HW_DATA_DIR\MyApp-Plugins\ComputePlugin\computeplugin.xplot.dll computeplugin.xplot.dll
      File /oname=$HW_DATA_DIR\MyApp-Plugins\ComputePlugin\computeplugin.VirtualVolume.dll computeplugin.VirtualVolume.dll
             
      File /oname=$HW_DATA_DIR\MyApp-Plugins\ExtensionPlugin\hwProxyInterface.MyApp.dll hwProxyInterface.MyApp.dll

      # MyPartnerApp workspace
      CreateDirectory "$HW_WORKSPACE_DIR"      
      
      ##All the files in Group 1 will be installed to the same location, $INSTDIR
      SetOutPath "$INSTDIR"
      ;messagebox mb_ok "MyPartnerApp Program: INSTDIR is $INSTDIR"
      
      # set environment variable for current user
      WriteRegExpandStr ${env_hkcu} HEADWAVE_ROOT_DIR $INSTDIR
      # save the selected headwave program directory
      StrCpy $MyPartnerAppSelectedInstallDir $INSTDIR
      # make sure windows knows about the change
      SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000

      # Install Sound-MyApp python scripts
      CreateDirectory $INSTDIR\python\hwtoolkits\MyCompany
      File __init__.py
      File MyAppConfig.py
      File MyAppPlugin.py
      
      CopyFiles $INSTDIR\*.py $INSTDIR\python\hwtoolkits\MyCompany

    notfoundHwData:          
    notfoundMyPartnerApp:
      ; Do nothing
  ${Else}
    Abort
  ${EndIf}          
SectionEnd

我本来以为应该首先调用 HeadwaveConfigurationPre 以便$HW_DATA_DIR应该是C:\HW-Data但我添加的消息框之一显示了这一点:

Headwave Plugin #2: HW_DATA_DIR = 6494062

更新 2:

感谢您的反馈,@Anders。

这是我最新的代码,最初它获取$HwDataDir$HwWorkspaceDir的值:

https://pastebin.com/VsT0MJf1注意:我之前在https://pastebin.com/DJTLQ05D中仅粘贴了部分代码

这是一个对话框,显示最初获取的值:

在此处输入图像描述

接下来进入插件安装页面:

在此处输入图像描述

但最终,它到达了这行代码:

MessageBox MB_OK 'Headwave Plugin #2: HwDataDir = $HwDataDir'

在这种情况下, $HwDataDir又有一个数字:

在此处输入图像描述

你能告诉我,怎么会这样? 为什么值会从C:\HW-Data变为 1181026? TIA。

您不能将 MUI_PAGE_CUSTOMFUNCTION_* 与 nsDialogs 一起使用。 在您上次更新 $HwDataDir 包含一个数字,因为它是文本控件的句柄,而不是它的文本。 即使你要求它的文本也是错误的时间,你应该在离开回调中这样做。 自定义页面只有 create 和 leave 回调,没有 pre 和 show!

以下是 nsDialogs 文档中的示例代码的一部分:

Page custom nsDialogsPage nsDialogsPageLeave
Page instfiles

Function nsDialogsPage

    nsDialogs::Create 1018
    Pop $Dialog

    ${If} $Dialog == error
        Abort
    ${EndIf}

    ${NSD_CreateLabel} 0 0 100% 12u "Hello, welcome to nsDialogs!"
    Pop $Label

    ${NSD_CreateText} 0 13u 100% -13u "Type something here..."
    Pop $Text

    nsDialogs::Show

FunctionEnd

Function nsDialogsPageLeave

    ${NSD_GetText} $Text $0
    MessageBox MB_OK "You typed:$\n$\n$0"

FunctionEnd

您的代码包含其他问题,例如

Section "MyPartnerApp Plugin" SEC1
  ${If} ${SectionIsSelected} ${SEC1}    

这是没有意义的,你不能那样检查自己。 IsPROG0HwDataSelected function 已损坏,您应该使用 ${If} 和适当的节索引从头开始重写它。

更新 2:

在您的新代码中, StrCpy $HwDataDir $headwaveConfigDataDirText是句柄“损坏”的地方。 你不需要 StrCpy,你只需要离开 function 就是${NSD_GetText} $headwaveConfigDataDirText $HwDataDir

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM