【问题标题】:NSIS - How to correctly determine the location of the installed 3ds max?NSIS - 如何正确确定安装的 3ds max 的位置?
【发布时间】:2018-07-14 00:09:59
【问题描述】:

我正在尝试为 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_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

请告诉我,哪里可能出错? 为什么安装程序会在启动时冻结? 当我删除这段代码 sn-p 一切正常,但它肯定不会检测到已安装的 3ds max 版本并且找不到位置。

升级:NSIS 3.03,Windows 7x64

UP2:我试图从 3ds max 的检查版本中删除,这些版本没有安装但它工作正常。事实证明,如果没有安装任何指定的版本,安装程序就会挂起。但是我们怎样才能让它简单地跳过未检测到的版本并只显示那些已安装版本的位置路径呢?我无法提前知道用户安装了哪些版本,哪些没有安装。

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

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。

有可能写得更短些吗?毕竟这里只是版本号变了。

【问题讨论】:

  • 哪个 NSIS 版本?
  • @Anders 抱歉,忘记指定版本 - NSIS 3.03,Windows 7x64

标签: registry installation nsis 3dsmax


【解决方案1】:

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

  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

  ...

如果你真的想跳,那么你需要跳到下一个项,而不是从头再来:

  #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。

【讨论】:

  • 谢谢!我稍微改变了我的代码,现在它可以工作了。我添加了对找到的已安装版本的检查。现在在安装目录的选择页面,从电脑上安装了最新版本的3ds max。
猜你喜欢
  • 2010-10-26
  • 2020-10-18
  • 2022-12-31
  • 2013-09-25
  • 2014-07-20
  • 1970-01-01
  • 2014-12-24
  • 2019-06-15
  • 2018-01-16
相关资源
最近更新 更多