Проверка пути установки NSIS - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу проверить путь установки, выбранный пользователем. Я не могу понять, как это проверить, чтобы это выглядело так:

  • Вы не можете выбрать путь с пробелами (кроме программных файлов)
  • Когда вы нажимаете " Установить ", то он выдаст сообщение об ошибке, сказав, что вы должны изменить каталог установки

На данный момент у меня есть это:

  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

Он отказывается устанавливать, когда есть свободное место в пути. Мне нужно изменить это, чтобы программные файлы были единственным исключением из этого правила. Также было бы полезно напечатать сообщение об ошибке

1 Ответ

0 голосов
/ 28 апреля 2020

Это ограничение не имеет смысла для меня. Некоторые устаревшие приложения не могут обрабатывать пробелы в пути, но это, конечно, также включает в себя папку Program Files (хотя взлом progra~1 можно использовать в качестве обходного пути , если генерация коротких имен активна).

NSIS не имеет определенного c способа отображения сообщения об ошибке / предупреждения непосредственно на странице, но вы можете изменить существующий текст в пользовательском интерфейсе и / или отобразить всплывающую подсказку.

!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).

...