NSIS设置的页面顺序如下
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE ".\license.txt"
!define MUI_PAGE_CUSTOMFUNCTION_SHOW HandleInstallDir
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_STARTMENU Application $data
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
欢迎界面-->授权协议-->自定义的模块-->选择目录。。。
选择目录之前有个模块用来检查是否安装,安装了就不允许选择目录,权当升级
Function HandleInstallDir
ReadRegStr $R1 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\MyApp" "InstallDir"
StrLen $R2 $R1
${If} $R2 > 2
StrCpy $INSTDIR $R1
Call DisableInstallDir
${EndIf}
FunctionEnd
Function DisableInstallDir
;禁用浏览按钮
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1001
EnableWindow $0 0
;禁止编辑目录
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1019
EnableWindow $0 0
FunctionEnd
结果打印$INSTDIR已经被修改为我设置的路径,目录选择界面的浏览和编辑控件也成功禁用了,
可是路径居然是默认的
!define PRODUCT_NAME "MyApp"
InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
导致编辑也失效了,只有默认的安装了
后来使用最简单的安装脚本,在.onInit里面初始化安装目录,居然成功了,可是NSIS改了这些也没跟我说,只能自己慢慢试了
Function .onInit
Call HandleInstallDir
FindProcDLL::FindProc "${PRODUCT_NAME}.exe"
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP "安装程序检测到$(^Name)正在运行,请退出程序后重试"
Quit
no_run:
FunctionEnd
.onInit中调用HandleInstallDir有点浪费,做个初始化就可以了的