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
该回调当安装成功且正当安装窗口关闭前 (如果 AutoCloseWindow 或 SetAutoClose 被设为 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、plug-ins、File 和 WriteRegBin 不能用于该回调函数。
例子:
Function .onRebootFailed MessageBox MB_OK|MB_ICONSTOP "重启失败,请手动重启。" /SD IDOK FunctionEnd
4.7.2.1.8 .onSelChange
当在组件选择页面选项被改变时被调用。常用于使用 SectionSetFlags 和 SectionGetFlags。
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、plug-ins、File 和 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