Macros NSI脚本:使用insertmacro从另一个宏调用一个宏时出错
我试图在NSI脚本中从另一个宏调用1个宏。两个宏都有MB_ok cancel。编译时会出现以下错误: ** [exec]错误:函数中已声明标签“abort_inst:” ** 请提供帮助(下次,请确保您的代码不会出现奇怪的换行) 插入宏时,Macros NSI脚本:使用insertmacro从另一个宏调用一个宏时出错,macros,nsis,Macros,Nsis,我试图在NSI脚本中从另一个宏调用1个宏。两个宏都有MB_ok cancel。编译时会出现以下错误: ** [exec]错误:函数中已声明标签“abort_inst:” ** 请提供帮助(下次,请确保您的代码不会出现奇怪的换行) 插入宏时,之间的所有代码!宏和!macroend将取代您的!插入宏。因此,不应在宏中使用静态标签–只能插入宏一次(使宏无意义!)可以使用相对跳转(例如Goto+2)或通过向标签添加参数使标签动态,例如: !macro myMacro param1 ${param
之间的所有代码!宏
和!macroend将取代您的!插入宏
。因此,不应在宏中使用静态标签–只能插入宏一次(使宏无意义!)可以使用相对跳转(例如Goto+2
)或通过向标签添加参数使标签动态,例如:
!macro myMacro param1
${param1}_loop:
MessageBox MB_YESNO "Loop this message?" IDYES ${param1}_loop
# some more code
${param1}_end:
!macroend
但是,既然不向宏传递任何参数,为什么不直接使用函数呢
Function installA
# your code here
Function
Function uninstallA
# your code here
Call installA
FunctionEnd
正如@idelberg所建议的那样,通过将一个宏转换为函数解决了这个问题。同样,只要使用宏,就不能使用静态标签。静态标签只能在函数或节中使用一次。使用宏将转换为以下内容:
Function .onInit
ReadRegStr $0 HKLM "x" "version"
${If} $0 == ""
MessageBox MB_OKCANCEL "A?" IDOK lblinstall IDCANCEL abort_inst
abort_inst:
Abort
Goto lblinstall
lblinstall: # FIRST TIME USE
${Else}
MessageBox MB_OKCANCEL "?" IDOK install_A IDCANCEL abort_uninstall
abort_uninstall:
Abort
install_A:
MessageBox MB_OKCANCEL "A?" IDOK lblinstall IDCANCEL abort_inst
abort_inst:
Abort
Goto lblinstall
lblinstall: # SECOND TIME USE
${EndIf}
FunctionEnd
因此,这将不起作用,因为lblinstall
标签被使用了两次。相反,您可以这样做:
Function installA
MessageBox MB_OKCANCEL "A?" IDOK lblinstall
Abort
lblinstall:
FunctionEnd
Function uninstallA
MessageBox MB_OKCANCEL "?" IDOK install_A
Abort
install_A:
Call installA
FunctionEnd
Function .onInit
ReadRegStr $0 HKLM "x" "version"
${If} $0 == ""
Call installA
${Else}
Call uninstallA
${EndIf}
FunctionEnd
(我还可以自由地从您的示例中删除一些不必要的标签)您的脚本中必须有其他一些标签已声明为abort\u inst。不,没有其他标签具有相同的名称。您给定的代码在我这里编译得很好,可能在其他部分出错。您可以共享完整的脚本吗?函数调用还提供错误:错误:无法解析函数“卸载”中的标签“\u LogicLib\u label\u 2”发布完整的脚本。我认为在给定的场景中,使用相对跳跃是唯一的解决方案?请让我知道如何实现它!包括“MUI2.nsh”输出文件abc.exe!宏installA MessageBox MB\u OK Cancel“A?”IDOK lblinstall IDCANCEL中止安装中止安装:中止转到lblinstall lblinstall:!马克龙德!宏卸载MessageBox MB\u OKCANCEL“?“IDOK安装\u IDCANCEL中止\u卸载中止\u卸载:中止安装\u A:!插入宏安装!macroend函数.onInit ReadRegStr$0 HKLM“x”版本“${If}$0==”!insertmacro安装${Else}!insertmacro卸载${EndIf}FunctionEnd Section“required”main_Section Section Section End
为未以正确格式发布代码而道歉。虽然前面有“`”,但仍然没有正确显示。修改了原始问题以添加新脚本。使用相对跳跃是唯一的出路?为什么函数给出错误“error:无法解析函数“uninstallA”中的标签“\u LogicLib\u label\u 2”
Function installA
MessageBox MB_OKCANCEL "A?" IDOK lblinstall
Abort
lblinstall:
FunctionEnd
Function uninstallA
MessageBox MB_OKCANCEL "?" IDOK install_A
Abort
install_A:
Call installA
FunctionEnd
Function .onInit
ReadRegStr $0 HKLM "x" "version"
${If} $0 == ""
Call installA
${Else}
Call uninstallA
${EndIf}
FunctionEnd