NSIS安装路径验证

问题描述 投票:0回答:1

我想验证用户选择的安装路径。我不知道如何检查,所以它将看起来像这样。

  • 你不能选择一个带空格的路径(除了程序文件)。
  • 当你点击 "安装 "时,就会提示错误,说你要更改安装目录。

现在我有这个问题。

  Function StrStr
  Exch $1 ; st=haystack,old$1, $1=needle
  Exch    ; st=old$1,haystack
  Exch $2 ; st=old$1,old$2, $2=haystack
  Push $3
  Push $4
  Push $5
  StrLen $3 $1
  StrCpy $4 0
  ; $1=needle
  ; $2=haystack
  ; $3=len(needle)
  ; $4=cnt
  ; $5=tmp
  loop:
    StrCpy $5 $2 $3 $4
    StrCmp $5 $1 done
    StrCmp $5 "" done
    IntOp $4 $4 + 1
    Goto loop
  done:
  StrCpy $1 $2 "" $4
  Pop $5
  Pop $4
  Pop $3
  Pop $2
  Exch $1
FunctionEnd

Function .onVerifyInstDir
Push "$INSTDIR"
Push " "
Call StrStr
Pop $0
StrCpy $0 $0 1
StrCmp $0 " " 0 +2
  Abort
FunctionEnd

当路径中有空格时,它拒绝安装。我需要修改这一点,使Program Files将是该规则的唯一例外。另外,打印错误信息会很有帮助

nsis electron-builder
1个回答
0
投票

这个限制对我来说毫无意义。一些传统的应用程序不能处理路径中的空格,但这当然也包括Program Files文件夹(虽然这个文件夹是由程序文件组成的)。progra~1 黑客可以作为一个变通的方法 如果 短名生成是活动的)。)

NSIS没有特定的方法来直接在页面上显示错误警告信息,但你可以在用户界面中改变现有的文本或显示一个气球。

!include WinMessages.nsh
!define /IfNDef EM_SHOWBALLOONTIP 0x1503
!define /IfNDef EM_HIDEBALLOONTIP 0x1504

!define DIRPAGE_CHANGETEXT ; Remove this line to disable the text change
!define DIRPAGE_BALLOON    ; Remove this line to disable the balloon
Function .onVerifyInstDir
    FindWindow $9 "#32770" "" $HWNDPARENT
!ifdef DIRPAGE_CHANGETEXT
    GetDlgItem $3 $9 1006 ; IDC_INTROTEXT
    LockWindow on
!endif
    StrCpy $1 0
    loop:
        StrCpy $2 $InstDir 1 $1
        StrCmp $2 '' valid ; End of string
        StrCmp $2 ' ' found_space
        IntOp $1 $1 + 1
        Goto loop
valid:
!ifdef DIRPAGE_CHANGETEXT
    SetCtlColors $3 SYSCLR:18 SYSCLR:15
    SendMessage $3 ${WM_SETTEXT} "" "STR:$(^DirText)"
    LockWindow off
!endif
!ifdef DIRPAGE_BALLOON
    GetDlgItem $3 $9 1019
    SendMessage $3 ${EM_HIDEBALLOONTIP} "" "" ; Not required?
!endif
    Return
found_space:
    StrLen $1 "$ProgramFiles\"
    StrCpy $2 "$InstDir\" $1
    StrCmp $2 "$ProgramFiles\" valid
!ifdef DIRPAGE_CHANGETEXT
    SetCtlColors $3 ff0000 transparent
    SendMessage $3 ${WM_SETTEXT} "" "STR:Paths with spaces are not allowed, except for $ProgramFiles for some reason!"
    LockWindow off
!endif
!ifdef DIRPAGE_BALLOON
    GetDlgItem $3 $9 1019
    System::Call '*(&l${NSIS_PTR_SIZE},w "Bad path!", w "Spaced not allowed in path!",p 3)p.r2'
    SendMessage $3 ${EM_SHOWBALLOONTIP} "" $2 ; This will only work on XP and later (and you must use "XPStyle on")
    System::Free $2
!endif
    Abort
FunctionEnd

XPStyle on
Page Directory

下一步 "按钮在以下情况下被禁用 Abort 内称 .onVerifyInstDir. 如果你想显示一个 MessageBox 当用户点击下一步时,你就不能调用 Abort.onVerifyInstDir,你将不得不使用页面离开函数回调(你必须再次验证路径,也许会调用 MessageBox+Abort).

© www.soinside.com 2019 - 2024. All rights reserved.