共享函数,在安装程序和卸载程序之间获取输入变量



如何修改以下语法,以便我的库函数可以在安装程序和卸载程序中使用?到目前为止,我只设法找到了一个不接受输入值的函数的示例。一个很好的例子可以在这里找到:

http://nsis.sourceforge.net/Sharing_functions_between_Installer_and_Uninstaller

如果您想传递变量并且仍然将该功能用于安装程序和卸载程序,我无法确定语法。

/* FILE: MyFunctionLibrary.nsh */
Function MyFunction
  !define MyFunction"!insertmacro MyFunctionCall"
  !macro MyFunctionCall _VAR1
    Push "${_VAR1}"
    Call MyFunction
  !macroend
  Exch $0
  MessageBox MB_OK $0
  Pop $0
FunctionEnd
/* FILE: MyInstallerScript.nsi */
/*...mui setup stuff...*/
!include "MyFunctionLibrary.nsh"
Section Install SEC01
  ${MyFunction} "install section"
SectionEnd
Section UnInstall SEC02
  ${MyFunction} "uninstall section"
SectionEnd
/*...other stuff...*/

这里有两件事。您需要生成这两个函数,这通常通过宏来完成。还可以(可选)提供用于调用函数的帮助程序宏。

最重要的一步是创建函数:

; --- MyFunctionLibrary.nsh ---
!macro DeclareMyFunction un
Function ${un}MyFunction
Exch $0
DetailPrint "MyFunction: parameter=$0"
Pop $0
FunctionEnd
!macroend
; --- MyInstallerScript.nsi ---
!insertmacro DeclareMyFunction ""
Section
Push "Hello World"
Call MyFunction
SectionEnd
!insertmacro DeclareMyFunction "un."
Section Uninstall
Push "Hello World"
Call un.MyFunction
SectionEnd

还有一种不太常见的方法,您可以通过在宏中仅提供函数代码来使用:

!macro MyFunctionCode
Exch $0
DetailPrint "MyFunction: parameter=$0"
Pop $0
!macroend
Function MyFunction
!insertmacro MyFunctionCode
FunctionEnd
Function un.MyFunction
!insertmacro MyFunctionCode
FunctionEnd

帮助您调用函数的宏只需要执行 x 个PushCall YourFunction 或 un。您的功能:

!macro DeclareMyFunction un
Function ${un}MyFunction
Exch $0
DetailPrint "MyFunction: parameter=$0"
Pop $0
FunctionEnd
!macroend
!define MyFunction "!insertmacro CallMyFunction"
!macro CallMyFunction Param1
Push "${Param1}"
!ifdef __UNINSTALL__
Call un.MyFunction
!else
Call MyFunction
!endif
!macroend
!insertmacro DeclareMyFunction ""
Section
${MyFunction} "Hello World"
SectionEnd
!insertmacro DeclareMyFunction "un."
Section Uninstall
${MyFunction} "Hello World"
SectionEnd

一些细节可以通过使用util.nsh抽象出来:

!include Util.nsh
!macro MyFunction
Exch $0
DetailPrint "MyFunction: parameter=$0"
Pop $0
!macroend
!define MyFunction "!insertmacro CallMyFunction"
!macro CallMyFunction Param1
Push "${Param1}"
!insertmacro CallArtificialFunction MyFunction
!macroend
Section
${MyFunction} "Hello World"
SectionEnd
Section Uninstall
${MyFunction} "Hello World"
SectionEnd

最新更新