4.4 相对跳转
优质
小牛编辑
128浏览
2023-12-01
和标记不一样,相对跳转就如其名一样,相对于被调用的地方。在任何你可用到标记的地方你也都可以相对跳转。相对跳转由数字标定。+1 跳转到下一条指令 (默认的步进),+2 会跳过一条指令也并且从当前指令转到第二条指令,-2 将往后跳两条指令,+10 将会跳过 9 条指令,从当前指令跳到第十条指令。
一条指令就是在安装程序运行时可以被执行的所有命令。MessageBox、Goto、GetDLLVersion、FileRead、SetShellVarContext 都是指令。AddSize、Section、SectionGroup、SectionEnd、SetOverwrite (和所有处于编译器标记)、Name、SetFont、LangString 都不是指令,因为它们在编译时就被执行。
例子:
Goto +2 MessageBox MB_OK "你将看不到这个信息框" MessageBox MB_OK "上一条信息被略过,这条信息才会被显示"
Goto +4 MessageBox MB_OK "随后的这条信息将会被略过" Goto +3 MessageBox MB_OK "你将不会看到这个信息框" Goto -3 MessageBox MB_OK "完成"
需要注意的是宏指令并不是真正意义上的一条指令,在编译时会被展开为若干条指令,所以你不能用相对跳转来跳过一条宏指令。下面的示例演示了相对跳转并没有真正跳过插入的宏 (仅仅是跳过了宏里的第一条指令),还是会显示一个消息框。
!macro relative_jump_test MessageBox MB_OK "第一条宏语句" MessageBox MB_OK "第二条宏语句" !macroend Goto +2 !insertmacro relative_jump_test