NSIS - 如何正确确定安装的 3ds max 的位置?
NSIS - How to correctly determine the location of the installed 3ds max?
我正在尝试为 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\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2013 FOUND_MOST_CURRENT
MAX2014:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT
MAX2015:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT
MAX2016:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2016 FOUND_MOST_CURRENT
MAX2017:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2017 FOUND_MOST_CURRENT
MAX2018:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.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_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 版本之一(列表中的第一个)位置的字段,为了 select 不同的版本,用户应单击浏览按钮并手动指定另一个版本的位置安装的 3ds max 版本
UP4: 我稍微更改了我的代码,现在可以使用了。我添加了对找到的已安装版本的检查:
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
; Scan reg for possible 3ds Max version is installed:
; MAX2013:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2014:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2015:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2016:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2017:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2018:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
FunctionEnd
InstallDir "$INSTDIR"
现在在安装目录的selection页面,从电脑安装最新版本的3ds max。
有没有可能写得更短一些?毕竟这里只是版本号变化而已
你的代码没有任何意义,如果它没有找到一个值,它只是试图再次读取它。您不需要所有这些标签,如果找不到,请继续下一个版本:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT
...
如果你真的想跳,那么你需要跳到下一个项目,而不是从头再来:
#MAX2013: ; This label is not used
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT
MAX2014:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT
MAX2015:
...
如果您真的想优先考虑最新版本,那么您应该颠倒顺序,首先检查最新版本,如果找到则跳转到 FOUND_MOST_CURRENT。
我正在尝试为 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\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2013 FOUND_MOST_CURRENT
MAX2014:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT
MAX2015:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT
MAX2016:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2016 FOUND_MOST_CURRENT
MAX2017:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2017 FOUND_MOST_CURRENT
MAX2018:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.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_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 版本之一(列表中的第一个)位置的字段,为了 select 不同的版本,用户应单击浏览按钮并手动指定另一个版本的位置安装的 3ds max 版本
UP4: 我稍微更改了我的代码,现在可以使用了。我添加了对找到的已安装版本的检查:
Function .onInit
!insertmacro MUI_LANGDLL_DISPLAY
; Scan reg for possible 3ds Max version is installed:
; MAX2013:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2014:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2015:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2016:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2017:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
; MAX2018:
setRegView 64
ReadRegStr HKLM "SOFTWARE\AutodeskdsMax.0" "Installdir"
${If} != ""
StrCpy $INSTDIR
${EndIf}
FunctionEnd
InstallDir "$INSTDIR"
现在在安装目录的selection页面,从电脑安装最新版本的3ds max。
有没有可能写得更短一些?毕竟这里只是版本号变化而已
你的代码没有任何意义,如果它没有找到一个值,它只是试图再次读取它。您不需要所有这些标签,如果找不到,请继续下一个版本:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT
...
如果你真的想跳,那么你需要跳到下一个项目,而不是从头再来:
#MAX2013: ; This label is not used
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT
MAX2014:
setRegView 64
ReadRegStr $MAX_DIR HKLM "SOFTWARE\AutodeskdsMax.0\MAX-1:409" "Installdir"
StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT
MAX2015:
...
如果您真的想优先考虑最新版本,那么您应该颠倒顺序,首先检查最新版本,如果找到则跳转到 FOUND_MOST_CURRENT。