简体   繁体   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?

Here is my latest NSIS installation script, which has grown into quite a beast.这是我最新的 NSIS 安装脚本,它已经成长为一个野兽。

https://pastebin.com/eSABLLsi https://pastebin.com/eSABLLsi

My question is, how can I put all of the sections for HW_DATA_DIR , HW_WORKSPACE_DIR , and possibly %HEADWAVE_ROOT_DIR% into a single page?我的问题是,如何将HW_DATA_DIRHW_WORKSPACE_DIR以及可能的%HEADWAVE_ROOT_DIR%的所有部分放入一个页面中? I am guessing that I would have to use nsDialog somehow.我猜我必须以某种方式使用nsDialog My supervisor wants me to do this because there are so many separate install pages where you have to keep clicking and clicking too many times to complete the installation.我的主管希望我这样做,因为有很多单独的安装页面,您必须在其中不断单击并单击太多次才能完成安装。

I have tried the following, but adding an nsDialog as Page custom HeadwaveConfiguration does in a function does not seem to fit well within the program flow.我尝试了以下方法,但是在 function 中添加nsDialogPage custom HeadwaveConfiguration似乎不太适合程序流程。 Here are my code modifications:这是我的代码修改:

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

But the problem is that it the HeadwaveConfiguration nsDialog page gets calls to obtain HW_DATA_DIR and HW_WORKSPACE_DIR , but then it just jumps to start installing MyApp instead of first installing the Headwave components and then moving on to install MyApp但问题是HeadwaveConfiguration nsDialog页面被调用以获取HW_DATA_DIRHW_WORKSPACE_DIR ,但随后它只是跳转开始安装MyApp而不是首先安装 Headwave 组件然后继续安装MyApp

Does anyone have any suggestions?有没有人有什么建议? TIA. TIA。

UPDATE:更新:

Here is how I have updated the code, but it still does not install the Headwave components before it jumps to the MyApp install page:这是我更新代码的方式,但在跳转到 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

I would have thought since HeadwaveConfigurationPre should be called first so that $HW_DATA_DIR should be C:\HW-Data but instead one of the messageboxes I added shows this:我本来以为应该首先调用 HeadwaveConfigurationPre 以便$HW_DATA_DIR应该是C:\HW-Data但我添加的消息框之一显示了这一点:

Headwave Plugin #2: HW_DATA_DIR = 6494062

UPDATE 2:更新 2:

Thanks for the feedback, @Anders.感谢您的反馈,@Anders。

Here is my latest code, where initially it is getting the values for $HwDataDir and $HwWorkspaceDir :这是我最新的代码,最初它获取$HwDataDir$HwWorkspaceDir的值:

https://pastebin.com/VsT0MJf1 NOTE: I previously pasted only partial code in https://pastebin.com/DJTLQ05D https://pastebin.com/VsT0MJf1注意:我之前在https://pastebin.com/DJTLQ05D中仅粘贴了部分代码

Here is a dialog box that shows the values are being obtained initially:这是一个对话框,显示最初获取的值:

在此处输入图像描述

Next it gets to the plugin installation page:接下来进入插件安装页面:

在此处输入图像描述

But then eventually, it gets to this line of code:但最终,它到达了这行代码:

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

In which case the $HwDataDir has a number again:在这种情况下, $HwDataDir又有一个数字:

在此处输入图像描述

Could you please tell me, how could that happen?你能告诉我,怎么会这样? Why would the value change from C:\HW-Data to 1181026?为什么值会从C:\HW-Data变为 1181026? TIA. TIA。

You cannot use MUI_PAGE_CUSTOMFUNCTION_* with nsDialogs.您不能将 MUI_PAGE_CUSTOMFUNCTION_* 与 nsDialogs 一起使用。 In your last update $HwDataDir contains a number because it is the handle to the text control, not its text.在您上次更新 $HwDataDir 包含一个数字,因为它是文本控件的句柄,而不是它的文本。 Even if you asked for its text it would be the wrong time, you should do that in the leave callback.即使你要求它的文本也是错误的时间,你应该在离开回调中这样做。 Custom pages only have create and leave callbacks, not pre and show!自定义页面只有 create 和 leave 回调,没有 pre 和 show!

Here is part of the example code from the nsDialogs documentation:以下是 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

Your code contains other issues like您的代码包含其他问题,例如

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

which makes no sense, you can't check itself like that.这是没有意义的,你不能那样检查自己。 The IsPROG0HwDataSelected function is so broken you should rewrite it from scratch with ${If} and a proper section index. IsPROG0HwDataSelected function 已损坏,您应该使用 ${If} 和适当的节索引从头开始重写它。

Update 2:更新 2:

In your new code, StrCpy $HwDataDir $headwaveConfigDataDirText is where it gets "corrupted" with the handle.在您的新代码中, StrCpy $HwDataDir $headwaveConfigDataDirText是句柄“损坏”的地方。 You don't need StrCpy, all you need in the leave function is ${NSD_GetText} $headwaveConfigDataDirText $HwDataDir .你不需要 StrCpy,你只需要离开 function 就是${NSD_GetText} $headwaveConfigDataDirText $HwDataDir

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

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