首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >offset的奇怪行为

offset的奇怪行为
EN

Stack Overflow用户
提问于 2021-04-05 05:42:42
回答 1查看 22关注 0票数 0

我有以下代码

代码语言:javascript
复制
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

即使在代码编译过程中没有出现错误/警告,代码行为也不是预期的那样。经过两个小时的“想象力”调试,我理解了我所经历的奇怪行为的原因。

在最后的代码中,我使用了“下一步”和“完成”标签,所有的问题都消失了!一开始,我使用数字来跳转(请查看评论字符串中的数字,这些数字应该是有效的,但实际上却不起作用!)

有人知道那些用于跳跃的数字错误的原因吗?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-05 08:31:15

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

在本例中,StrLoc和If/Else/EndIf都是宏。

标签在生成的安装程序中的开销为零,并且应该在大多数地方使用(和/或If/EndIf)。直接偏移量在宏中很有用,这些宏可能在同一个函数/部分中多次出现,您不能使用If/EndIf/While (很少),但它很快就失控了。您可以使用类似于!define MyLabel L${__COUNTER__}的内容为类似这样的宏创建标签:

代码语言:javascript
复制
!macro Test
!define MyLabel L${__COUNTER__}
...
StrCmp $1 $2 ${MyLabel}_end
...
${MyLabel}_end:
!undef MyLabel
!macroend
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66946138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档