首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NSIS -如何正确确定安装的3ds最大值的位置?

NSIS -如何正确确定安装的3ds最大值的位置?
EN

Stack Overflow用户
提问于 2018-02-03 18:18:40
回答 1查看 434关注 0票数 0

我正在尝试为3DSmax中的maxscript创建一个NSIS安装程序。当我从一个模板创建一个简单的脚本时,当我尝试添加一个从注册表读取数据的函数以确定3ds max的安装版本并找到它们的位置时,所有操作都会出现问题。脚本是编译的,没有任何错误,但是当我试图运行它时,它会挂起,什么也不会发生。

下面是NSIS脚本的代码片段,其中执行从注册表读取的过程,将已安装的3DSmax版本的信息写入ini文件。因此,在安装期间,用户应该看到安装了3ds max的目标文件夹:

代码语言:javascript
运行
复制
;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_installdir.ini

代码语言:javascript
运行
复制
[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的安装版本,也找不到位置。

UP:NSIS3.03,Windows7x64

UP2:我试着从3ds max的检查版本中删除,该版本没有安装,而且工作正常。如果没有安装任何指定版本,则安装程序将挂起。但是,我们如何才能简单地跳过未检测到的版本,只显示已安装的版本的位置路径呢?我无法预先知道哪些版本是由用户安装的,哪些版本没有安装。

UP3:还有另一个问题:如何显示3DSmax的安装版本列表,以便用户只需检查他想要安装脚本的版本?现在只显示一个3ds max版本的位置(列表中的第一个版本),为了选择不同的版本,用户应该单击“浏览”按钮并手动指定另一个已安装版本的3ds max的位置。

UP4:我稍微修改了我的代码,现在它开始工作了。我添加了已找到的已安装版本的检查:

代码语言:javascript
运行
复制
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的最新版本是从计算机上安装的。

以某种方式写得更快是可能的?毕竟,这里只更改版本号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-04 12:09:13

您的代码没有任何意义,如果它找不到一个值,它只是尝试再次读取它。您不需要所有这些标签,只要继续下一个版本,如果找不到它:

代码语言:javascript
运行
复制
  setRegView 64
  ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\15.0\MAX-1:409" "Installdir"
  StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT

  setRegView 64
  ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\16.0\MAX-1:409" "Installdir"
  StrCmp $MAX_DIR "" 0 FOUND_MOST_CURRENT

  ...

如果您真的想跳转,那么需要跳到next项,而不是再次跳到相同的项:

代码语言:javascript
运行
复制
  #MAX2013: ; This label is not used
  setRegView 64
  ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\15.0\MAX-1:409" "Installdir"
  StrCmp $MAX_DIR "" MAX2014 FOUND_MOST_CURRENT

  MAX2014:
  setRegView 64
  ReadRegStr $MAX_DIR HKLM "SOFTWARE\Autodesk\3dsMax\16.0\MAX-1:409" "Installdir"
  StrCmp $MAX_DIR "" MAX2015 FOUND_MOST_CURRENT

  MAX2015:
  ...

如果你真的想优先考虑最近的版本,那么你应该改变顺序,先检查最新版本,如果找到了就跳到FOUND_MOST_CURRENT。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48600508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档