2012-01-02 12 views
5

मैं एनएसआईएस का उपयोग कर एक इंस्टॉलर बना रहा हूं। यह इंस्टॉलर वास्तव में एक ही इंस्टॉलर में दो अलग-अलग निर्देशिकाओं में दो प्रोग्राम स्थापित करता है। मैं इसे आधुनिक यूजर इंटरफेस (एमयूआई) पृष्ठों का उपयोग करके कर रहा हूं और एमयूआई_PAGE_DIRECTORY को दो बार अलग-अलग प्रारंभिक पैरामीटर्स निर्दिष्ट करता हूं, और लाइव मैक्रो में निर्देशिका को कैप्चर करता हूं। मैं क्या सोच रहा हूं, क्या मैं किसी फ़ंक्शन में InstallDir को कॉल कर सकता हूं, या किसी फ़ंक्शन में ऑटो निर्देशिका पॉप्युलेट मान सेट कर सकता हूं? या ब्राउज बटन से वापस लौटने के बाद संभवत: फ़ंक्शन को कॉल भी किया गया है?किसी फ़ंक्शन में InstallDir का सेट मान सेट करें, या किसी भी तरह ऑटो पॉप्युलेट मान सेट करें?

कारण यह है कि मैं ऐसा करना चाहता हूं, जब उपयोगकर्ता निर्देशिका के चयन के बाद दो निर्देशिका पृष्ठों में से किसी एक ब्राउज़ बटन पर क्लिक करता है, तो इंस्टॉलडियर में निर्दिष्ट अंतिम निर्देशिका का नाम जोड़ा जाएगा।

उदाहरण के लिए: कार्यक्रम 1 के लिए INSTALLDIR मूल्य: सी: कार्यक्रम 2 के लिए \ ग्राहक INSTALLDIR मूल्य: c: \ प्रोग्राम फ़ाइलें \ सर्वर

उपयोगकर्ता क्लिक कार्यक्रम 1 पर ब्राउज़ करें और चुनता c: \ अस्थायी जिसके परिणामस्वरूप \ जो कुछ भी है, जिसके परिणामस्वरूप पथ सी है:: \ जो कुछ भी \ सर्वर

संदर्भ के लिए यहाँ क्या मुझे लगता है कि है कोड snipits हैं

उपयोगकर्ता क्लिक कार्यक्रम 2 पर ब्राउज़ करें और चुनता ग \ अस्थायी \ ग्राहक: पथ सी है काम करता है, लेकिन ऑटो संलग्न ब्राउज़ बटन व्यवहार से निपटता नहीं है:

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ClientDirectoryLeave 
!insertmacro MUI_PAGE_DIRECTORY 

!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ServerDirectoryLeave 
!insertmacro MUI_PAGE_DIRECTORY 

; Setup the page display for the client install page 
Function ShowPageClient 
    !insertmacro MUI_HEADER_TEXT "Client" "Client" 
    !insertmacro MUI_INNERDIALOG_TEXT 1006 "Client" 

    ; setup intal directory 
    Push $0 
    StrCpy $0 $PROGRAMFILES 2 # 
    ; CLIENT_FOLDER_NAME is defined as a folder, but this would basicaly 
    ; result in C:\Client as the first 2 characters of $PROGRAMFILES 
    ; is the hard drive with program files installed on it 
    StrCpy $INSTDIR "$0\${CLIENT_FOLDER_NAME}" 
    Pop $0 

    ; set the inital value of the directory text box 
    !insertmacro MUI_INNERDIALOG_TEXT 1019 $INSTDIR 

    ; find and disable the directory selection box 
    ; We do not want users to type in this box 
    FindWindow $R0 "#32770" "" $HWNDPARENT 
    GetDlgItem $R1 $R0 1019 ;Text Box 
    EnableWindow $R1 0 
FunctionEnd 


; Setup the page display for the server install location page 
Function ShowPageServer 
    !insertmacro MUI_HEADER_TEXT "Server" "Server" 
    !insertmacro MUI_INNERDIALOG_TEXT 1006 "Server" 

    ; setup intal directory 
    ; SERVER_FOLDER_NAME is defined as a folder, but this would basicaly 
    ; result in C:\Program Files\Server 
    StrCpy $INSTDIR "$PROGRAMFILES\${SERVER_FOLDER_NAME}" 

    ; set the inital value of the directory text box 
    !insertmacro MUI_INNERDIALOG_TEXT 1019 $INSTDIR 

    ; find and disable the directory selection box 
    ; We do not want users to type in this box 
    FindWindow $R0 "#32770" "" $HWNDPARENT 
    GetDlgItem $R1 $R0 1019 ;Text Box 
    EnableWindow $R1 0 

FunctionEnd 

नोट: मैं निर्देशिका पृष्ठों में से एक के लिए ब्राउज़ बटन काम कर सकते हैं, लेकिन तब जब मैं दूसरे पृष्ठ पर कर रहा हूँ, ऑटो वास्तविक ऑटो पॉप्युलेट गलत तरीके से भरता है

उत्तर

4

ठीक है, मैं अंत में यह लगा बाहर। मूल रूप से एक ऐसा फ़ंक्शन होता है जिसे ब्राउज़ बटन क्लिक करने के बाद पथ को "सत्यापित" करने के लिए कहा जाता है। यदि आवश्यक हो तो मैंने इस फ़ंक्शन में एक निर्देशिका मैनुअल जोड़ा है। ऐसा करने के लिए मैं एक नया चर बनाया है और एक समारोह कहा जाता है में सेट पृष्ठ प्रदर्शित करता है जब इस प्रकार है:

; Client Directory 
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowPageClient 
!define MUI_PAGE_CUSTOMFUNCTION_LEAVE ClientDirectoryLeave 
!insertmacro MUI_PAGE_DIRECTORY 

; Setup the page display for the client install page 
Function ShowPageClient 
    ; setup intal directory 
    Push $0 
    StrCpy $0 $PROGRAMFILES 2 # 
    StrCpy $INSTDIR "$0\${CLIENT_FOLDER_NAME}" 
    Pop $0 

    !insertmacro MUI_INNERDIALOG_TEXT 1019 $INSTDIR 

    FindWindow $R0 "#32770" "" $HWNDPARENT 
    GetDlgItem $R1 $R0 1019 ;Text Box 
    EnableWindow $R1 0 

    ; Setup the client or server variable to indicate that 
    ; we're in the client install part to signal the .onVerifyInstDir function 
    ; to put the correct directory 
    StrCpy $CLIENT_OR_SERVER "client" 
FunctionEnd 

समारोह है कि ब्राउज़ के बाद कहा जाता है .onVerifyInstDir ताकि है वह जगह है जहाँ मैं CLIENT_OR_SERVER चर की जाँच करें और .onVerifyInstD को http://nsis.sourceforge.net/StrContains

आगे संदर्भ: StrContains समारोह मैं इस्तेमाल किया यहाँ पाया गया था: पथ उचित रूप से

; This function is special and is called any time a 
; path is validated on returning from the browse button 
; need to append the correct directory if it does not already exists 
; in the install directory path 
Function .onVerifyInstDir 
    ; save the current $0 register, as it is used in this function 
    Push $0 

    ${If} $CLIENT_OR_SERVER == "client" 
    ; in the client stage so directory must contain CLIENT_FOLDER_NAME 
    ${StrContains} $0 "${CLIENT_FOLDER_NAME}" "$INSTDIR" 
    ${If} $0 == "" 
     ; the install dir does not contain the folder so append it 
     StrCpy $INSTDIR "$INSTDIR\${CLIENT_FOLDER_NAME}" 
    ${EndIf} 
    ${Else} 
    ; in the server stage so directory must contain SERVER_FOLDER_NAME 
    ${StrContains} $0 "${SERVER_FOLDER_NAME}" "$INSTDIR" 
    ${If} $0 == "" 
     ; the install dir does not contain the folder so append it 
     StrCpy $INSTDIR "$INSTDIR\${SERVER_FOLDER_NAME}" 
    ${EndIf} 
    ${EndIf} 

    ; pop the saved register value 
    Pop $0 
FunctionEnd 

युगल नोटों सेट आईआर फ़ंक्शन यहां पाया जा सकता है: http://nsis.sourceforge.net/Docs/Chapter4.html#4.7.2.1.10

+0

पाठ इनपुट को अक्षम करने से शांत IMHO नहीं है – Anders

4

संलग्न फ़ोल्डर का नाम स्थिर है और संकलन समय पर सेट है, इस से संबंधित bug report है।

मेरी सलाह संलग्न सुविधा का परित्याग और जाने उपयोगकर्ता दो स्थलों पर पूरा नियंत्रण है के लिए है:

Name "NSIS Test" 
InstallDir "" 
!include MUI.nsh 
Var DirClient 
Var DirServer 

Function .onInit 
;Set default destinations 
StrCpy $DirClient "$ProgramFiles\$(^Name)\Client" 
StrCpy $DirServer "$ProgramFiles\$(^Name)\Server" 
FunctionEnd 

!macro ConfigureMyDirPage type var 
!define MUI_DIRECTORYPAGE_VARIABLE ${var} 
!define MUI_PAGE_HEADER_SUBTEXT "Choose the folder in which to install $(^NameDA) ${type}" 
!define MUI_DIRECTORYPAGE_TEXT_TOP "Setup will install $(^NameDA) ${type} in the following folder. To install in a different folder, click Browse and select another folder. $_CLICK" 
!define MUI_DIRECTORYPAGE_TEXT_DESTINATION "${type} $(^DirSubText)" 
!macroend 

!insertmacro ConfigureMyDirPage "Client" $DirClient 
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro ConfigureMyDirPage "Server" $DirServer 
!insertmacro MUI_PAGE_DIRECTORY 

!insertmacro MUI_PAGE_INSTFILES 

!insertmacro MUI_LANGUAGE "English" 

Section 
DetailPrint DirClient=$DirClient 
DetailPrint DirServer=$DirServer 
SectionEnd 
संबंधित मुद्दे