调用必须与以“un”开头的函数名称一起使用。在卸载部分

Posted

技术标签:

【中文标题】调用必须与以“un”开头的函数名称一起使用。在卸载部分【英文标题】:Call must be used with function names starting with "un." in the uninstall section 【发布时间】:2012-10-01 22:28:01 【问题描述】:
...
!include "nsDialogs.nsh"
!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "XML.nsh"
  !insertmacro "UpdateXml"
...
!insertmacro MUI_UNPAGE_LICENSE "$NSISDIR\Docs\Modern UI\License.txt"
UninstPage custom un.PageReinstall
!insertmacro MUI_UNPAGE_CONFIRM
...

Function un.PageReinstall
...
$UpdateXml "http://127.0.0.1/123.xml" "/XML/A" $321 ; line 232 
...
FunctionEnd

NSIS 日志:

!insertmacro: UpdateXmlCall 调用必须与函数名称一起使用 以“联合国”开头。在卸载部分。用法:调用 函数名 | [:label_name] 宏 UpdateXmlCall 中的错误 宏行 5 第 232 行的脚本“G:\Basic.nsi”中的错误——正在中止 创作过程

怎么了?

【问题讨论】:

【参考方案1】:

卸载程序使用的函数必须以un.为前缀,宏也是如此。

因此,如果您正在使用宏并且希望能够从安装程序和卸载程序中使用它,则必须将其插入 2 次(一次带有 un. 前缀,另一次不带有 un. 前缀)。

在脚本开头添加!insertmacro "UpdateXml" 或将!insertmacro un.UpdateXml 替换为!insertmacro un.UpdateXml 应该可以解决问题(前提是un.UpdateXml 宏在xml.nsh 中定义)。

【讨论】:

但是由于UpdateXml/un.UpdateXml 不能调用另一个宏,它仍然无法编写好的代码。我很沮丧!【参考方案2】:

How to call an nsi function in uninstall section? 的回答展示了如何使用宏避免函数重复:

!macro TestFunction UN
Function $UNTestFunction
   ;do stuff
FunctionEnd
!macroend
!insertmacro TestFunction "" 
!insertmacro TestFunction "un."

用途:

Section "Install"
  Call TestFunction
EndSection

Section "Uninstall"
  Call un.TestFuction
SecionEnd

【讨论】:

以上是关于调用必须与以“un”开头的函数名称一起使用。在卸载部分的主要内容,如果未能解决你的问题,请参考以下文章

12 Python 函数

Symfony2 - 方法名称必须以findBy或findOneBy开头

函数及参数

部署:如何访问 Windows 服务名称以便(卸载)安装程序可以卸载它?

初识函数

组件“div”的视图配置 getter 回调必须是一个函数(收到“未定义”)。确保以大写字母开头的组件名称