我有以下代码
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没有问题,但似乎情况并非如此:)
发布于 2021-04-05 08:31:15
您不应该使用偏移量来跳过宏,因为您不知道它们包含多少指令(并且可能在不同的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
!macroendhttps://stackoverflow.com/questions/66946138
复制相似问题