当前位置: 首页 > 文档资料 > NSIS 用户手册 >

4.7 函数

优质
小牛编辑
124浏览
2023-12-01

函数类似于区段因为他们可以包含零个或多个指令。用户函数不会被安装程序直接调用,而必须在区段里使用 Call 指令来调用。而当一个必然事件发生时回调函数将由安装程序调用。

函数必须在区段或其他函数之外声明。

4.7.1 函数命令

4.7.1.1 Function

[函数名]

开始并打开一个新的函数。常规函数名以 . 开头的 (例如 ".Whatever") 作为回调函数保留。函数名以 un. 开头的函数将会被创建在卸载程序里。因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通安装程序的函数。

Function func
  # 一些命令
FunctionEnd
Section
  Call func
SectionEnd

4.7.1.2 FunctionEnd

该命令关闭当前打开的函数。

4.7.2 回调函数

你可以创建特殊名称的回调函数。这些函数将会由安装程序在安装时需要某些用途时调用。下面是当前可用的回调函数列表:

4.7.2.1 安装回调

4.7.2.1.1 .onGUIInit

该回调将会在第一个页面被载入并且显示安装程序对话框前被调用,允许你来调整用户界面。

例子:

 !include "WinMessages.nsh"
 Function .onGUIInit
   # 1028 是标志文本控件的 ID
   GetDlgItem $R0 $HWNDPARENT 1028
   CreateFont $R1 "Tahoma" 10 700
   SendMessage $R0 ${WM_SETFONT} $R1 0
   # 设置背景颜色为白色,文本颜色为红色
   SetCtlColors $R0 FFFFFF FF0000
 FunctionEnd
4.7.2.1.2 .onInit

该回调将会在当安装程序接近完成初始化时调用。如果 .onInit 函数调用了 Abort,则安装程序立即退出。

这里有两个例子说明了怎么使用:

 Function .onInit
   MessageBox MB_YESNO "即将安装。继续?" IDYES NoAbort
     Abort ; 使得安装程序退出。
   NoAbort:
 FunctionEnd

或:

 Function .onInit
   ReadINIStr $INSTDIR $WINDIR\wincmd.ini Configuration InstallDir
   StrCmp $INSTDIR "" 0 NoAbort
     MessageBox MB_OK "未找到 Windows Commander,未能取得安装路径。"
     Abort ; 使得安装程序退出。
   NoAbort:
 FunctionEnd
4.7.2.1.3 .onInstFailed

该回调函数当在安装失败后用户点击“取消”按钮时被调用 (如果安装程序不能释放任何文件,或安装脚本使用了 Abort 命令)。

例子:

  Function .onInstFailed
    MessageBox MB_OK "祝您下次好运。"
  FunctionEnd
4.7.2.1.4 .onInstSuccess

该回调当安装成功且正当安装窗口关闭前 (如果 AutoCloseWindowSetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

例子:

  Function .onInstSuccess
    MessageBox MB_YESNO "恭喜,运行正常。查看说明文档?" IDNO NoReadme
      Exec notepad.exe ; 查看说明文档或其他。
    NoReadme:
  FunctionEnd
4.7.2.1.5 .onGUIEnd

该回调正当安装程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

4.7.2.1.6 .onMouseOverSection

该回调只要鼠标在树形区段选择框上移动时就被调用。这可以使你给每个区段设置一个样本描述。鼠标停留所在的当前区段 ID 已被临时的保存,为 $0。

例子:

  Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043 ; 描述项 (必须添加到界面)
    StrCmp $0 0 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:第一个区段描述"
    StrCmp $0 1 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:第二个区段描述"
  FunctionEnd
4.7.2.1.7 .onRebootFailed

该回调函数当 Reboot 指令失败时被调用。WriteUninstallerplug-insFileWriteRegBin 不能用于该回调函数。

例子:

 Function .onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "重启失败,请手动重启。" /SD IDOK
 FunctionEnd
4.7.2.1.8 .onSelChange

当在组件选择页面选项被改变时被调用。常用于使用 SectionSetFlagsSectionGetFlags

4.7.2.1.9 .onUserAbort

该回调当用户点击“取消”按钮且安装尚未失败时被调用。如果该函数调用 Abort,则安装将不退出。

例子:

 Function .onUserAbort
   MessageBox MB_YESNO "退出安装?" IDYES NoCancelAbort
     Abort ; 使得安装程序不退出。
   NoCancelAbort:
 FunctionEnd
4.7.2.1.10 .onVerifyInstDir

该回调对于你的安装程序来说可以允许代为控制安装路径是否有效。每次用户更改安装路径的时候这段代码都会被调用一次,所以不要在这里使用 MessageBox 等傻指令。如果该函数调用 Abort,则 $INSTDIR 的路径被认为无效。

例子:

  Function .onVerifyInstDir
    IfFileExists $INSTDIR\Winamp.exe PathGood
      Abort ; 如果 $INSTDIR 不是 Winamp 路径,则不让用户安装在这里
    PathGood:
  FunctionEnd

4.7.2.2 卸载回调

4.7.2.2.1 un.onGUIInit

该回调将会在第一个页面被载入并且显示卸载程序对话框前被调用,允许你来调整卸载程序的界面。

例子请看 .onGUIInit

4.7.2.2.2 un.onInit

该回调将会在当卸载程序接近完成初始化时调用。如果 un.onInit 函数使用了 Abort ,则卸载程序立即退出。注意如果需要时该函数可以验证和/或修改 $INSTDIR。

这里有两个例子说明了怎么使用:

  Function un.onInit
    MessageBox MB_YESNO "即将卸载。继续?" IDYES NoAbort
      Abort ; 使得卸载程序退出。
    NoAbort:
  FunctionEnd

或:

  Function un.onInit
    IfFileExists $INSTDIR\myfile.exe found
      Messagebox MB_OK "卸载路径不正确"
      Abort
    found:
  FunctionEnd
4.7.2.2.3 un.onUninstFailed

该回调函数当在卸载失败后用户点击“取消”按钮时被调用 (如果使用了 Abort 命令或其它失败的命令)。

例子:

  Function un.onUninstFailed
    MessageBox MB_OK "祝你下次好运。"
  FunctionEnd
4.7.2.2.4 un.onUninstSuccess

该回调当卸载成功且正当卸载程序窗口关闭前 (如果 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

例子:

  Function un.onUninstSuccess
    MessageBox MB_OK "恭喜,已经移除。"
  FunctionEnd
4.7.2.2.5 un.onGUIEnd

该回调正当卸载程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

4.7.2.2.6 un.onRebootFailed

该回调函数当 Reboot 指令失败时被调用。WriteUninstallerplug-insFile WriteRegBin 不能用于该回调函数。

例子:

 Function un.onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "重启失败,请手动重启。" /SD IDOK
 FunctionEnd
4.7.2.2.7 un.onUserAbort

该回调当用户点击“取消”按钮且卸载尚未失败时被调用。如果该函数调用 Abort,则卸载程序将不退出。

例子:

  Function un.onUserAbort
    MessageBox MB_YESNO "退出卸载?" IDYES NoCancelAbort
      Abort ; 使得卸载程序不能退出。
    NoCancelAbort:
  FunctionEnd