上一页 | 目录 | 下一页

4.7 函数

函数类似于区段因为他们可以包含零个或多个指令。用户函数不会被安装程序直接调用,而必须在区段里使用 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 指令失败时被调用。 WriteUninstaller, 插件, FileWriteRegBin 不能用于该回调函数。

例子:

 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 指令失败时被调用。 WriteUninstaller, 插件, FileWriteRegBin 不能用于该回调函数。

例子:

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

该回调函数当 组件选择页面 选项被改变时被调用。常用于使用 SectionSetFlagsSectionGetFlags

组件选项被改变包括组件和安装类型被改变。

4.7.2.2.8 un.onUserAbort

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

例子:

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

上一页 | 目录 | 下一页