NSIS 常用小问题合集(论坛收集)
程序代码
问: NSIS里那种算法打包出来的文件更小?
答: LZMA(固实) 相当于 7z 创建固实压缩档案。如果用 SetCompressorDictSize 把字典调大(不过同时也减慢了速度,占用更大内存),应该可以把压缩调到极限压缩等级。7z 的极限压缩默认字典为 32 MB
SetCompressor /SOLID lzma
SetCompressorDictSize 32
答: LZMA(固实) 相当于 7z 创建固实压缩档案。如果用 SetCompressorDictSize 把字典调大(不过同时也减慢了速度,占用更大内存),应该可以把压缩调到极限压缩等级。7z 的极限压缩默认字典为 32 MB
SetCompressor /SOLID lzma
SetCompressorDictSize 32
程序代码
1.问: 为什么 NSIS 中的变量可以装 数值,也可以装 字符串。
答: NSIS 是一种弱性语言,变量全部都是字符串,如果是整数运算的话在内不会自动把字符转换成整数变量。也就是说内部会执行类似于 atoi 的运算。
2.问: .onInstSuccess是当安装成功且正当安装窗口关闭前调用,有没有当“安装成功”且正当安装窗口关闭后调用的回调函数呢?若没有,那么有没有办法在安装成功且正当安装窗口关闭前将页面隐藏(因为我此时使用了一个messagebox,想在message弹出时将 完成页面 隐藏。现在的情况是,message弹出,完成页面还在背后,真难看)?
答: 以下脚本实现
Function .onInstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地安装到你的计算机。"
FunctionEnd
答: NSIS 是一种弱性语言,变量全部都是字符串,如果是整数运算的话在内不会自动把字符转换成整数变量。也就是说内部会执行类似于 atoi 的运算。
2.问: .onInstSuccess是当安装成功且正当安装窗口关闭前调用,有没有当“安装成功”且正当安装窗口关闭后调用的回调函数呢?若没有,那么有没有办法在安装成功且正当安装窗口关闭前将页面隐藏(因为我此时使用了一个messagebox,想在message弹出时将 完成页面 隐藏。现在的情况是,message弹出,完成页面还在背后,真难看)?
答: 以下脚本实现
Function .onInstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地安装到你的计算机。"
FunctionEnd
程序代码
问: 关于把焦点定位到指定控件的方法。
答: 在这里假设为一个控件为文本控件,ID 为 1200,第二个为编辑框控件,ID 为 1201,那么默认的时候编辑框里的文本是选中的。
1. 把焦点转移到第一个控件上面
Function PageSet
InstallOptions::initDialog /NOUNLOAD $PLUGINSDIR\io.ini
Pop $0
GetDlgItem $1 $0 1200
System::Call 'User32::SetFocus(i r1) i'
InstallOptions::show
Pop $0
FunctionEnd
2. 取消编辑框的文本选择
Function PageSet
InstallOptions::initDialog /NOUNLOAD $PLUGINSDIR\io.ini
Pop $0
GetDlgItem $1 $0 1200
SendMessage $1 ${EM_SETSEL} -1 0
InstallOptions::show
Pop $0
FunctionEnd
3. 把焦点设到下一步按钮上面算了,下一步的控件 ID 是 1
!define MUI_PAGE_CUSTOMFUNCTION_SHOW PageShow
!insertmacro MUI_PAGE_DIRECTORY
Function PageShow
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1
System::Call 'User32::SetFocus(i r1) i'
FunctionEnd
以上的代码中用到的控件 ID 可用 ResHacker 获取。
答: 在这里假设为一个控件为文本控件,ID 为 1200,第二个为编辑框控件,ID 为 1201,那么默认的时候编辑框里的文本是选中的。
1. 把焦点转移到第一个控件上面
Function PageSet
InstallOptions::initDialog /NOUNLOAD $PLUGINSDIR\io.ini
Pop $0
GetDlgItem $1 $0 1200
System::Call 'User32::SetFocus(i r1) i'
InstallOptions::show
Pop $0
FunctionEnd
2. 取消编辑框的文本选择
Function PageSet
InstallOptions::initDialog /NOUNLOAD $PLUGINSDIR\io.ini
Pop $0
GetDlgItem $1 $0 1200
SendMessage $1 ${EM_SETSEL} -1 0
InstallOptions::show
Pop $0
FunctionEnd
3. 把焦点设到下一步按钮上面算了,下一步的控件 ID 是 1
!define MUI_PAGE_CUSTOMFUNCTION_SHOW PageShow
!insertmacro MUI_PAGE_DIRECTORY
Function PageShow
FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $1 $0 1
System::Call 'User32::SetFocus(i r1) i'
FunctionEnd
以上的代码中用到的控件 ID 可用 ResHacker 获取。
程序代码
问: 因为要安装的程序不能安装到包含空格的路径中,否则程序不能正常运行.请问在NSIS中有没有办法判断$INSTDIR中有空格?
答: 基本上这类问题可以简单化为是否符合 Dos 的 8.3 命名规则,就可以避免很多这类问题的发生。用 GetFullPathName 来获取短路径名。然后得到的字符串跟原来的路径字符串相比较,如果不相等,就是不符合 8.3 的规则,所以才会转出短路径。
答: 基本上这类问题可以简单化为是否符合 Dos 的 8.3 命名规则,就可以避免很多这类问题的发生。用 GetFullPathName 来获取短路径名。然后得到的字符串跟原来的路径字符串相比较,如果不相等,就是不符合 8.3 的规则,所以才会转出短路径。
程序代码
问: 如果我把安装程序刻到光盘,安装时自动得到光驱盘符附给一个变量该怎么编写?
答: StrCpy $0 $EXEDIR 3
答: StrCpy $0 $EXEDIR 3