Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
174 views
in Technique[技术] by (71.8m points)

How can I define more than one directory variable in NSIS script?

Please note that I have created a single variable without a problem as described here, but when I try to create a second variable, I get this error:

!define: "MUI_DIRECTORYPAGE_VARIABLE" already defined!

Here is what I have setup which works for a single variable:

Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
// ...
!define HW_DATA "HW-Data"

## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"

;Directory for App files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre   
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install 
${HW_DATA} in the following folder..."

## Sections Group 0
Function wel_pre
  StrCpy $APP_DIR "C:${HW_DATA}"
     strcmp '$0' '1' noabort
     messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave MyApp directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
     strcpy $0 2
     abort
   noabort:
     strcpy $0 1             
Functionend

Function dir_pre
     GetDlgItem $1 $HWNDPARENT 1037
     CreateFont $2 "$(^Font)" "8" "700"
     SendMessage $1 ${WM_SETFONT} $2 0
     SetCtlColors $1  '0x000000' '0xFFFFFF'

     GetDlgItem $1 $HWNDPARENT 1038
     CreateFont $2 "$(^Font)" "8" ""
     SendMessage $1 ${WM_SETFONT} $2 0
     SetCtlColors $1  '0x000000' '0xFFFFFF'                       
Functionend

!define PROG0_InstDir    "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex   ${SEC0} 

SectionGroup /e "MyApp" PROG0 
Section "Main" SEC0
    CreateDirectory "$HW_DATA"
    CreateDirectory "$HW_DATAPlugins"
    CreateDirectory "$HW_DATAPluginsComputePlugin"
    CreateDirectory "$HW_DATAPluginsExtensionPlugin"                                       

    File /oname=$HW_DATAPluginsComputePlugincomputeplugin.xplot.dll computeplugin.xplot.dll
    File /oname=$HW_DATAPluginsExtensionPluginhwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll   
SectionEnd

This is how I am attempting to add a second variable:

Var HW_DATA_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_DATA_DIR
Var HW_WORKSPACE_DIR
!define MUI_DIRECTORYPAGE_VARIABLE $HW_WORKSPACE_DIR
// ...
!define HW_DATA "HW-Data"
!define HW_WORKSPACE "HW-Workspaces"  

## This is the title on the MyApp Directory page
!define MUI_DIRECTORYPAGE_TEXT_TOP "$(MUI_DIRECTORYPAGE_TEXT_TOP_HW)"

;Directory for MyApp files and where config.dat will point to
!define MUI_PAGE_CUSTOMFUNCTION_PRE wel_pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW dir_pre   
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES

// ...

LangString MUI_DIRECTORYPAGE_TEXT_TOP_HW ${LANG_ENGLSH} "Setup will install 
${HW_DATA} in the following folder..."

## Sections Group 0
Function wel_pre
  StrCpy $HW_DATA_DIR "C:${HW_DATA}" 
  StrCpy $$HW_WORKSPACE_DIR "C:${HW_WORKSPACE}"  
     strcmp '$0' '1' noabort
     messagebox mb_yesno|mb_defbutton2|mb_iconquestion "Leave Headwave directories at default values of C:${HW_DATA} and C:${HW_WORKSPACE}?" idno noabort
     strcpy $0 2
     abort
   noabort:
     strcpy $0 1             
Functionend

Function dir_pre
     GetDlgItem $1 $HWNDPARENT 1037
     CreateFont $2 "$(^Font)" "8" "700"
     SendMessage $1 ${WM_SETFONT} $2 0
     SetCtlColors $1  '0x000000' '0xFFFFFF'

     GetDlgItem $1 $HWNDPARENT 1038
     CreateFont $2 "$(^Font)" "8" ""
     SendMessage $1 ${WM_SETFONT} $2 0
     SetCtlColors $1  '0x000000' '0xFFFFFF'                       
Functionend

!define PROG0_InstDir    "C:${HW_DATA}"
!define PROG0_StartIndex ${PROG0}
!define PROG0_EndIndex   ${SEC0} 

SectionGroup /e "MyApp" PROG0 
Section "Main" SEC0
    CreateDirectory "$HW_DATA"
    CreateDirectory "$HW_DATAPlugins"
    CreateDirectory "$HW_DATAPluginsComputePlugin"
    CreateDirectory "$HW_DATAPluginsExtensionPlugin"                                       

    File /oname=$HW_DATAPluginsComputePlugincomputeplugin.xplot.dll computeplugin.xplot.dll
    File /oname=$HW_DATAPluginsExtensionPluginhwProxyInterface.MyProApp.dll hwProxyInterface.MyProApp.dll   

    CreateDirectory "$HW_WORKSPACE_DIR"  
SectionEnd

See also https://nsis.sourceforge.io/Demonstrating_Page%27s_Custom_Functions_Pre_Show_Leave

https://nsis.sourceforge.io/Two_installations_in_one_installer

Does anyone have any suggestions? In my case I happen to need to create a data directory and a workspace directory for a particular application, with default values but also allowing the user to change the DATA directory and the WORKSPACE directory to custom directories in case, say, they need to be on a network drive instead of being on the default C: drive. TIA.

question from:https://stackoverflow.com/questions/65930540/how-can-i-define-more-than-one-directory-variable-in-nsis-script

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The directory variable define is a per-page setting and must be set just before the page macro:

Var foo
Var bar
!define MUI_DIRECTORYPAGE_VARIABLE $foo
insertmacro MUI_PAGE_DIRECTORY
!define MUI_DIRECTORYPAGE_VARIABLE $bar
!insertmacro MUI_PAGE_DIRECTORY

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...