代码之家  ›  专栏  ›  技术社区  ›  zvon

NSIS-如何正确确定已安装3ds max的位置?

  •  0
  • zvon  · 技术社区  · 7 年前

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

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

    1 回复  |  直到 7 年前
        1
  •  0
  •   Anders    7 年前

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

      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\u most\u CURRENT。