我正在尝试为3ds max中的maxscripts创建NSIS安装程序。当我从模板创建简单脚本时,一切都正常,但当我尝试添加从注册表读取数据以确定3ds max的安装版本并查找其位置的函数时,出现了问题。脚本编译时没有任何错误,但当我尝试运行它时,它会挂起,什么也没有发生。
下面是NSIS脚本的代码片段,在该脚本中执行从注册表读取的过程,将找到的有关3ds max已安装版本的信息写入ini文件。因此,在安装过程中,用户应该看到安装了3ds max的目标文件夹:
;The path where 3ds Max is located:
Var MAX_DIR
;Page setup:
Page custom getMAX_DIR
Page instfiles
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
InitPluginsDir
File /oname=$PLUGINSDIR\max_installdir.ini "max_installdir.ini"
; Scan for possible REG-entries:
MAX2013:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\15.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2013 FOUND_MOST_CURRENT
MAX2014:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\16.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT
MAX2015:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\17.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT
MAX2016:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\18.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2016 FOUND_MOST_CURRENT
MAX2017:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\19.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2017 FOUND_MOST_CURRENT
MAX2018:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\20.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2018 FOUND_MOST_CURRENT
FOUND_MOST_CURRENT:
; Write max dir into form:
WriteINIStr "$PLUGINSDIR\max_installdir.ini" "Field 3" "state" $MAX_DIR
FunctionEnd
Function getMAX_DIR
Push $R0
InstallOptions::dialog "$PLUGINSDIR\max_installdir.ini"
Pop $R0
ReadINIStr $MAX_DIR "$PLUGINSDIR\max_installdir.ini" "Field 3" "state"
; MessageBox MB_OK "$MAX_DIR"
Pop $R0
FunctionEnd
此处代码
max\u installdir。ini公司
:
[Settings]
NumFields=3
[Field 1]
Type=Groupbox
Text=Install uMax
Left=0
Right=264
Top=0
Bottom=130
[Field 2]
Type=Label
Text=Please locate your 3ds Max ROOT directory:
Left=20
Right=168
Top=26
Bottom=40
[Field 3]
Type=DirRequest
State=test
Left=22
Right=220
Top=68
Bottom=80
请告诉我哪里会出错?
为什么安装程序在启动时会冻结?
删除此代码段后,一切正常,但它肯定不会检测到已安装的3ds max版本,也找不到位置。
向上
:NSIS 3.03,Windows 7x64
UP2
:我试图从3ds max的检查版本中删除,该版本未安装,但已正常运行。。如果没有安装任何指定版本,安装程序就会挂起。但是,我们如何让它跳过未检测到的版本,只显示已安装版本的位置路径呢?我无法提前知道用户安装了哪些版本,哪些没有安装。
UP3
:还有另一个问题:如何显示已安装的3ds max版本列表,以便用户只需检查要安装脚本的版本?现在,仅显示一个字段,其中包含3ds max的一个版本(列表中的第一个版本)的位置,为了选择其他版本,用户应单击浏览按钮并手动指定另一个已安装版本的3ds max的位置。
UP4
:我稍微更改了代码,现在可以使用了。我添加了对找到的已安装版本的检查:
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
; Scan reg for possible 3ds Max version is installed:
; MAX2013:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\15.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
; MAX2014:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\16.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
; MAX2015:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\17.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
; MAX2016:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\18.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
; MAX2017:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\19.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
; MAX2018:
setRegView 64
ReadRegStr $1 HKLM "SOFTWARE\Autodesk\3dsMax\20.0" "Installdir"
${If} $1 != ""
StrCpy $INSTDIR $1
${EndIf}
FunctionEnd
InstallDir "$INSTDIR"
现在,在安装目录的选择页上,将从计算机安装最新版本的3ds max。
有可能写得更简短些吗?毕竟,这里只更改了版本号。