【问题标题】:Set global variable from within macro从宏中设置全局变量
【发布时间】:2012-05-03 06:20:38
【问题描述】:

在 NSIS 脚本语言中,当我从宏中访问全局变量时出现错误。

我的变量 installDirectory 真的是全局的吗?如何在宏或函数中设置变量 installDirectory(如果可能在函数中)?

var installDirectory

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      $installDirectory "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

宏和/或函数也可以在 NSIS(或 shd 我只使用 push/pop)中返回值吗?

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      return "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

var installDir !insertmacro IdentifyDir # is that valid?

【问题讨论】:

  • 为什么要标记为 [assembly]?

标签: installation nsis


【解决方案1】:

有两个问题:

  • 分配一个变量,你错过了一个赋值指令;对于字符串变量,您可以使用 StrCpy :StrCpy $installDirectory "C:\test\9.00\"

  • 如your another question about labels 中所述,标签不是subs,而只是一些可以通过流控制到达的定义点,因此当跳转到Version9 标签时,如果没有另一个跳转,执行将运行到@ AbortInstall 标签后面的 987654325@ 语句。您应该或者在!macroEnd 语句之前添加另一个标签,例如end_of_macro:,并在AbortInstall 标签之前添加goto(注意宏在where em> 你放了!insertMacro 所以你必须选择一个唯一的标签名称,它不像部分或函数)或(更优雅)反转两个标签:在中止的情况下执行将在那里停止,在第二种情况下,它将在宏之外继续

!macro IdentifyDir 
    IfFileExists C:\temp\9.00 Version9 AbortInstall
AbortInstall:
    Abort
Version9:
    StrCpy $installDirectory "C:\test\9.00\"
!macroend

关于返回值的问题,可以使用默认寄存器$0到$9和$R0到$R9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2011-05-06
    • 2019-07-18
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多