NSIS 小问题


问: 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 "输入法安装失败"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值