【问题标题】:Weird behaviour of offset偏移的奇怪行为
【发布时间】:2021-04-04 21:42:41
【问题描述】:

我有以下代码

ClearErrors
ReadRegStr $R0 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "ProductReleaseIds"
IfErrors done                       ;+19 if error
${StrLoc} $R1 $R0 "365" ">"
    StrCmp $R1 "" next 0            ;+8 if substring is not found
    ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "Platform"
        ${If} $R1 = "x86"
            StrCpy $R1 "365x32"
        ${Else}
            StrCpy $R1 "365x64"
        ${EndIf}
        Goto found_${ID}
next: ${StrLoc} $R1 $R0 "2019" ">"
    StrCmp $R1 "" done 0            ;+8 if substring is not found
    ReadRegStr $R1 HKLM "SOFTWARE\Microsoft\Office\ClickToRun\Configuration" "Platform"
        ${If} $R1 = "x86"
            StrCpy $R1 "2019x32"
        ${Else}
            StrCpy $R1 "2019x64"
        ${EndIf}
        Goto found_${ID}
done: ClearErrors

即使在代码编译过程中没有出现错误/警告,代码行为也不如预期。经过 2 小时的“富有想象力”的调试,我明白了我遇到的奇怪行为的原因。

在最后的代码中,我使用了“下一步”和“完成”标签,我的所有问题都消失了!一开始我使用数字来跳跃(请查看 cmets 字符串中的数字,这些数字应该可以工作,但实际上却没有用!)。

有谁知道这些用于跳跃的数字是错误的原因吗?

在正常情况下,我发誓我数到 20 是没有问题的,但似乎情况并非如此 :)

【问题讨论】:

    标签: offset nsis


    【解决方案1】:

    您不应该使用偏移量来跳过宏,因为您不知道它们包含多少指令(并且可能会在 NSIS 版本之间发生变化)。

    在您的情况下,StrLoc 和 If/Else/EndIf 是宏。

    标签在生成的安装程序中的开销为零,应在大多数地方使用(和/或 If/EndIf)。直接偏移在宏中很有用,这些宏可能在同一函数/部分中多次包含,您不能使用 If/EndIf/While(罕见),但它很快就会失控。您可以使用 !define MyLabel L${__COUNTER__} 之类的东西为这样的宏创建标签:

    !macro Test
    !define MyLabel L${__COUNTER__}
    ...
    StrCmp $1 $2 ${MyLabel}_end
    ...
    ${MyLabel}_end:
    !undef MyLabel
    !macroend
    

    【讨论】:

      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      相关资源
      最近更新 更多