问: NSIS对于安装卸载的ICO图标大小有什么要求?编译的时候出现以下错误提示,
Error finding icon resources: installer, uninstaller icon size mismatch - see the Icon instructions documentation for more information -- failing!
答: 只要保证安装图标与卸载图标大小相同即可。
问: 如何屏蔽如下图中的安装程序校验。 答: CRCCheck on|off|force 指定安装前安装程序是否对自身执行一个 CRC。注意,如果用户使用了 /NCRC 命令行参数,且你没有指定 force 参数时,不会执行 CRC,这样有可能导致用户安装一个损坏的安装程序。 安装程序 CRC 校验是默认打开的。可以在脚本中用 CRCCheck off 来默认禁止安装程序的 CRC 校验。不过这样做正如解释上说的可能安装会出现问题。作汉化的最好加上校验,免得安装程序的问题变成你汉化质量的问题。 |
附图:
问: 在安装的时候不是可以选择多种语言么?但是我怎样实现当选择英文时就装英文版,选择中文时就装中文版? 答: 使用以下脚本, StrCmp $LANGUAGE ${LANG_SIMPCHINESE} 0 +3 File "你需要安装的中文文件" Goto lbl_finish File "你需要安装的英文文件" lbl_finish: |
问: 组件A 组件B 组件C 均为可选,A可单独安装,B或者C被选择的时候A必须被选择 答: 以下代码, Section "组件 A" aaa detailprint "A" SectionEnd Section "组件 B" bbb detailprint "B" SectionEnd Section "组件 C" ccc detailprint "C" SectionEnd Function .onSelChange SectionGetFlags ${bbb} $0 SectionGetFlags ${ccc} $1 IntOp $0 $0 & 1 IntOp $1 $1 & 1 IntCmp $0 1 0 +2 SectionSetFlags ${aaa} 1 IntCmp $1 1 0 +2 SectionSetFlags ${aaa} 1 FunctionEnd 解释:SectionGetFlags 表示获取某区段的flags状态(就是是否被勾选,选中返回值为1,反之为0) SectionGetFlags ${bbb} $0 表示获取序号为${bbb}的区段的Flags状态并把返回值输出到变量 $0,C 区段相同。 接着就是 StrCmp ,解释同上楼。 SectionSetFlags ${aaa} 1 表示设置序号为 ${aaa} 区段的 Flags 状态为 1,即勾选。 |
问: 如果是这样写的时候就可以在左边显示页眉位图 !define MUI_ABORTWARNING !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico" !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "f:\11.bmp" 会显示如附图1。会靠左,但是如果把 MUI_HEADERIMAGE 换成 MUI_HEADERIMAGE_RIGHT 就无法显示位图,只能出现安装图标了,如附图2。 答: 把插入的headerimage图片放到右边(默认是在左边) !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT !define MUI_HEADERIMAGE_BITMAP "include\resource\modern-header.bmp" 而不是你所说的修改 !define MUI_HEADERIMAGE,应该是在这句下面添加 !define MUI_HEADERIMAGE_RIGHT |
附图1:
附图2:
问: 怎么让 "许可协议"页面的标题栏,如程序中的“MutliPages 演示”修改为“MutliPages 演示:许可协议”,如附图。 答: 首先创建一个函数,如下。 Function LicensePagePre SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:我爱你" FunctionEnd 然后在协议页面句子 !insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt" 之前加入如下语句 !define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre |
附图:
问: 比如,我把 a.exe 用nsis包装好,安装到 c:\helloLib\a.exe,完成后,想把c:\helloLib\添加到 系统环境变量的 path里头,这样,在任何地方输入 a.exe可执行。如何将路径添加到 系统环境变量中? 答:以下代码实现: ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;C:\hellolib" 另类方法一: 写注册表,如 [HKEY_CLASSES_ROOT\Applications\a.exe\shell\open\command] @="yourpath\a.exe" 另类方法二: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\a.exe] @="c:\helloLib\a.exe" |
问:在NSIS中如何才能做到根据对于注册表键值的判断决定是否写入字串,如果判断出某个key存在,则写入相应的字串,如果不存在,则不写入字串。例如:我先要判断 “ HKLM SOFTWARE\nsis”这个key存不存在。如果存在则写入字串“DispName:nsis”,应该是用“WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis"”。如果不存在这个key,则不写入注册表,继续下面的安装。 答: 以下代码实现, ReadRegStr $0 HKLM SOFTWARE\nsis "" IfErrors 0 +2 Goto +2 WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis" |
问: 如何制作安装包的时候需要调用系统函数来检测当前安装包运行的操作系统的内码页。 答: 以下代码显示系统语言 System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s" Pop $0 IntOp $0 $0 & 0xFFFF MessageBox MB_OK $0 |
问: 如何用NSIS注册字体? 答: 以下代码, !include WinMessages.nsh Section "MainSection" SEC01 File /oname=$FONTS\tahoma.ttf tahoma.ttf Push "$FONTS\tahoma.ttf" System::Call "Gdi32::AddFontResource(t s) i .s" Pop $0 IntCmp $0 0 0 +2 +2 MessageBox MB_OK "注册字体失败" SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0 SectionEnd |
问: 如何用 NSIS 安装输入法。
答: 以下代码,
SetOutPath $SYSDIR
File WBIME.ime
Push "五笔输入法"
Push "$SYSDIR\WBIME.ime"
System::Call "Imm32::ImmInstallIME(t s, t s) i .s"
System::Call "Imm32::ImmIsIME(i s) i .s"
Pop $0
IntCmp $0 1 0 +3 +3
MessageBox MB_OK "输入法安装成功"
Goto +2
MessageBox MB_OK "输入法安装失败"
附图1:
附图2:
问: 怎么让 "许可协议"页面的标题栏,如程序中的“MutliPages 演示”修改为“MutliPages 演示:许可协议”,如附图。 答: 首先创建一个函数,如下。 Function LicensePagePre SendMessage $HWNDPARENT ${WM_SETTEXT} 0 "STR:我爱你" FunctionEnd 然后在协议页面句子 !insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt" 之前加入如下语句 !define MUI_PAGE_CUSTOMFUNCTION_PRE LicensePagePre |
附图:
问: 比如,我把 a.exe 用nsis包装好,安装到 c:\helloLib\a.exe,完成后,想把c:\helloLib\添加到 系统环境变量的 path里头,这样,在任何地方输入 a.exe可执行。如何将路径添加到 系统环境变量中? 答:以下代码实现: ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;C:\hellolib" 另类方法一: 写注册表,如 [HKEY_CLASSES_ROOT\Applications\a.exe\shell\open\command] @="yourpath\a.exe" 另类方法二: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\a.exe] @="c:\helloLib\a.exe" |
问:在NSIS中如何才能做到根据对于注册表键值的判断决定是否写入字串,如果判断出某个key存在,则写入相应的字串,如果不存在,则不写入字串。例如:我先要判断 “ HKLM SOFTWARE\nsis”这个key存不存在。如果存在则写入字串“DispName:nsis”,应该是用“WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis"”。如果不存在这个key,则不写入注册表,继续下面的安装。 答: 以下代码实现, ReadRegStr $0 HKLM SOFTWARE\nsis "" IfErrors 0 +2 Goto +2 WriteRegStr HKLM "SOFTWARE\nsis" "DispName" "nsis" |
问: 如何制作安装包的时候需要调用系统函数来检测当前安装包运行的操作系统的内码页。 答: 以下代码显示系统语言 System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s" Pop $0 IntOp $0 $0 & 0xFFFF MessageBox MB_OK $0 |
问: 如何用NSIS注册字体? 答: 以下代码, !include WinMessages.nsh Section "MainSection" SEC01 File /oname=$FONTS\tahoma.ttf tahoma.ttf Push "$FONTS\tahoma.ttf" System::Call "Gdi32::AddFontResource(t s) i .s" Pop $0 IntCmp $0 0 0 +2 +2 MessageBox MB_OK "注册字体失败" SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0 SectionEnd |
问: 如何用 NSIS 安装输入法。
答: 以下代码,
SetOutPath $SYSDIR
File WBIME.ime
Push "五笔输入法"
Push "$SYSDIR\WBIME.ime"
System::Call "Imm32::ImmInstallIME(t s, t s) i .s"
System::Call "Imm32::ImmIsIME(i s) i .s"
Pop $0
IntCmp $0 1 0 +3 +3
MessageBox MB_OK "输入法安装成功"
Goto +2
MessageBox MB_OK "输入法安装失败"
问: 如何用NSIS注册字体?
答: 以下代码,
!include WinMessages.nsh
Section "MainSection" SEC01
File /oname=$FONTS\tahoma.ttf tahoma.ttf
Push "$FONTS\tahoma.ttf"
System::Call "Gdi32::AddFontResource(t s) i .s"
Pop $0
IntCmp $0 0 0 +2 +2
MessageBox MB_OK "注册字体失败"
SendMessage ${HWND_BROADcast} ${WM_FONTCHANGE} 0 0
SectionEnd
问: 如何用 NSIS 安装输入法。
答: 以下代码,
SetOutPath $SYSDIR
File WBIME.ime
Push "五笔输入法"
Push "$SYSDIR\WBIME.ime"
System::Call "Imm32::ImmInstallIME(t s, t s) i .s"
System::Call "Imm32::ImmIsIME(i s) i .s"
Pop $0
IntCmp $0 1 0 +3 +3
MessageBox MB_OK "输入法安装成功"
Goto +2
MessageBox MB_OK "输入法安装失败"