上一页 | 目录 | 下一页

4.4 相对跳转

和标记不一样,相对跳转就如其名一样,相对于被调用的地方。在任何你可用到标记的地方你也都可以相对跳转。相对跳转由数字标定。+1 跳转到下一条指令(默认的步进),+2 会跳过一条指令也并且从当前指令转到第二条指令,-2 将往后跳两条指令,+10 将会跳过 9 条指令,从当前指令跳到第十条指令。

一条指令就是在安装程序运行时可以被执行的所有命令。 MessageBoxGotoGetDLLVersionFileReadSetShellVarContext 都是指令。 AddSizeSectionSectionGroupSectionEndSetOverwrite (和所有处于编译器标记)、 NameSetFontLangString 都不是指令,因为它们在编译时就被执行。

例子:

 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 "第一个宏行first macro line"
  MessageBox MB_OK "第二个宏行second macro line"
!macroend

Goto +2
!insertmacro relative_jump_test

上一页 | 目录 | 下一页