madams
2nd July 2007 21:18 UTC
Installation Directory Restrictions
Hello,
What I am trying to do is check the installation directory chosen by the user, and if it contains any spaces (ex: Program Files) disable the "next" button and show a message box informing the user that the installation directory may not contain spaces. I know how to disable the "next" button and create a message box, but I can't figure out how to check for spaces in the $INSTDIR variable.
If anyone knows how to do this, please let me know.
Thanks.
Red Wine
2nd July 2007 23:59 UTC
; ---------------------------------------------------------------
; Function StrOutOfStr 
                                                               /*
     Usage:
       !insertmacro StrOutOfStr     ; for installer
       !insertmacro un.StrOutOfStr  ; for uninstaller
     Whithin installer section/function use:
          ${StrOutOfStr} "Input_String" "String_To_Get" "$var"
               $var = String_To_Get if found
               if not found/error then $var = error
     Whithin uninstaller section/function use:
          ${un.StrOutOfStr} "Input_String" "String_To_Get" "$var"
               $var = String_To_Get if found
               if not found/error then $var = error
                                                               */
!macro StrOutOfStrFunc UN
Function ${UN}StrOutOfStr
   Exch $0 ;str to get
   Exch
   Exch $1 ;input str
   Push $2
   Push $3
   Push $4
   Push $5
        StrCpy $3 "0"
        StrLen $4 "$0"
        StrLen $5 "$1"
        IntCmp $4 $5 0 0 _err
        Intop $5 $5 - $4
  _start:
        StrCpy $2 "$1" $4 $3
        StrCmp "$2" "$0" _done
        IntCmp "$3" "$5" _err
        Intop $3 $3 + 1
        Goto _start
   _err:
        StrCpy $2 "error"
  _done:
        StrCpy $0 "$2"
   Pop $5
   Pop $4
   Pop $3
   Pop $2
   Pop $1
   Exch $0
FunctionEnd
!macroend
!macro StrOutOfStrCall _UN _INPUT _FIND _RESULT
    Push "${_INPUT}"
    Push "${_FIND}"
    Call ${_UN}StrOutOfStr
    Pop "${_RESULT}"
!macroend
!macro StrOutOfStr
    !define StrOutOfStr `!insertmacro StrOutOfStrCall ""`
    !insertmacro StrOutOfStrFunc ""
!macroend
!macro un.StrOutOfStr
    !define un.StrOutOfStr `!insertmacro StrOutOfStrCall "un."`
    !insertmacro StrOutOfStrFunc "un."
!macroend
;----------------------------------------
; Example of usage
outfile 'test.exe'
ShowInstDetails show
!define STRING_TO_GET  " "
!insertmacro StrOutOfStr
;!insertmacro un.StrOutOfStr
Section -
    ${StrOutOfStr} "$PROGRAMFILES"  "${STRING_TO_GET}"  "$R0"
     DetailPrint "Search result: [$R0]"
SectionEnd
     
    
      madams
      3rd July 2007 14:23 UTC
      Thanks for the code Red Wine. I'm pretty new to NSIS though, and I'm not totally sure how I'm supposed to use it. If you could give me little bit more usage information, that would be great.
      
      Thanks.
     
    
      Red Wine
      3rd July 2007 18:47 UTC
      Don't know what else should I add, it is a function that you can use to find a specific string within a given sting, so it finds the space for your case.
      There is a small example of usage as well, just copy/paste and compile the code to see the action.
      Furthermore, you said that you know all the rest ;)