[英]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_DIR
、 HW_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 中添加
nsDialog
为Page 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_DIR
和HW_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.