【问题标题】:Behavior of StrCmp in NSIS. Can we compare "" with other strings?NSIS 中 StrCmp 的行为。我们可以将“”与其他字符串进行比较吗?
【发布时间】:2015-05-31 16:14:34
【问题描述】:

我们可以将零字符串(“”)和非零字符串(例如,“foo”)与 NSIS 中的 StrCmp 进行比较吗?

当我使用 NSIS 安装程序更新应用程序时,我想删除以前安装的发行版本的链接。另外,我想在卸载应用程序时删除链接。为了避免代码重复,我写了下一个宏:

!macro Delete_Links un
        MessageBox MB_OK "Previous version is: $PVN and p1 is: ${un}"
        StrCmp ${un} "un." 0 +2 
            StrCpy $PVN ${VERSION_INFO}
        Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} $PVN.lnk"
        ; ...
!macroend

这里 $PVN 是变量,它包含以前安装的版本号(作为字符串),${VERSION_INFO} 是当前版本号(也是字符串)。

代码正常工作,如果我用非零参数 un 调用它,例如,我可以在卸载程序部分调用宏:

!insertmacro Delete_Links ".un"

在安装程序部分为:

!insertmacro Delete_Links ".in"

但是如果我传递给宏零字符串

!insertmacro Delete_Links ""

宏中的 StrCmp 不会相对跳转 +2 到

Delete "$SMPROGRAMS\${APP_NAME}\${APP_NAME} $PVN.lnk"

并执行下一条指令

StrCmp ${un} "un." 0 +2

这不是预期的行为。

但我已经检查过了,(${un} == "") 和 ("" != ".un")。这段代码有什么问题?

【问题讨论】:

    标签: nsis


    【解决方案1】:

    !insertmacro 将吃掉引号,因此当参数为“”时,您实际上最终会在宏中执行 StrCmp "un." 0 +2 和“un”。永远不等于“0”!

    使用时需要引用宏参数:StrCmp "${un}" "un." 0 +2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-18
      • 2011-03-20
      • 2018-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多