Macros NSI脚本:使用insertmacro从另一个宏调用一个宏时出错

Macros NSI脚本:使用insertmacro从另一个宏调用一个宏时出错,macros,nsis,Macros,Nsis,我试图在NSI脚本中从另一个宏调用1个宏。两个宏都有MB_ok cancel。编译时会出现以下错误: ** [exec]错误:函数中已声明标签“abort_inst:” ** 请提供帮助(下次,请确保您的代码不会出现奇怪的换行) 插入宏时,之间的所有代码!宏和!macroend将取代您的!插入宏。因此,不应在宏中使用静态标签–只能插入宏一次(使宏无意义!)可以使用相对跳转(例如Goto+2)或通过向标签添加参数使标签动态,例如: !macro myMacro param1 ${param

我试图在NSI脚本中从另一个宏调用1个宏。两个宏都有MB_ok cancel。编译时会出现以下错误:

** [exec]错误:函数中已声明标签“abort_inst:” **

请提供帮助(下次,请确保您的代码不会出现奇怪的换行)

插入宏时,
之间的所有代码!宏
!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