学习NSIS一段时间了,在这段时间里自己遇到了很多问题,也用自己摸索的方法一个个解决了,先将积累的知识点以及自己遇到的问题及解决方案,与大家共享下:
第一部分:页面设置
; MUI 预定义常量
通用页面
向导页面头上的文字!define MUI_PAGE_HEADER_TEXT text
向导页面头上的文字想到(解释用)!define MUI_PAGE_HEADER_SUBTEXT text
欢迎页面
大标题设置!define MUI_WELCOMEPAGE_TITLE "${PRODUCT_NAME}安装向导"
标题下子内容设置!define MUI_WELCOMEPAGE_TEXT "欢迎说明或软件说明等"
授权页面
安装协议定义!insertmacro MUI_PAGE_LICENSE “文件”
    显示在页面顶部的文字!define MUI_LICENSEPAGE_TEXT_TOP text
    显示在页面底部的文字!define MUI_LICENSEPAGE_TEXT_BOTTOM text
    按钮方式时按钮上的文字!define MUI_LICENSEPAGE_BUTTON button_text
用户需要钩选该 checkbox 来接受软件许可!define MUI_LICENSEPAGE_CHECKBOX
    在 checkbox 旁显示的文字!define MUI_LICENSEPAGE_CHECKBOX_TEXT text
钩选radio box 接受或拒绝许可!define MUI_LICENSEPAGE_RADIOBUTTONS
radio旁接受文字!define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text
radio旁拒绝文字!define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text
组件选择页面
    顶部文字!define MUI_COMPONENTSPAGE_TEXT_TOP text
    组件旁文字!define MUI_COMPONENTSPAGE_TEXT_COMPLIST text
    下拉框旁文字!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE text
    描述框顶部文字!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
无组件描述框文字!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text
安装目录页面
    页面顶部文字!define MUI_DIRECTORYPAGE_TEXT_TOP text
    路径选择框上文字!define MUI_DIRECTORYPAGE_TEXT_DESTINATION text
    存放用户选择的目录的变量,默认是 $INSTDIR 
!define MUI_DIRECTORYPAGE_VARIABLE variable
不禁用"下一步"按钮!define MUI_DIRECTORYPAGE_VERIFYONLEAVE
安装进度页面
页面头上的文字!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT text
    进一步说明!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text
完成页面
    页面标题!define MUI_FINISHPAGE_TITLE title
    页面标题区的额外空格!define MUI_FINISHPAGE_TITLE_3LINES
    显示在完成页面上文字!define MUI_FINISHPAGE_TEXT text
    使checkbox 时,设定文本区额外空间!define MUI_FINISHPAGE_TEXT_LARGE
完成按钮的显示文字!define MUI_FINISHPAGE_BUTTON text
重启操作系统 checkbox 旁的文字!define MUI_FINISHPAGE_TEXT_REBOOT text
显示在'Reboot now'旁的文字!define MUI_FINISHPAGE_TEXT_REBOOTLATER text
指定checkbox 选择运行的应用程序!define MUI_FINISHPAGE_RUN exe_file
程序 checkbox 旁的文字!define MUI_FINISHPAGE_RUN_TEXT text
运行应用程序的参数!define MUI_FINISHPAGE_RUN_PARAMETERS parameters
指定checkbox 为非选中状态!define MUI_FINISHPAGE_RUN_NOTCHECKED
安装完成执行的nsi函数!define MUI_FINISHPAGE_RUN_FUNCTION function_name
checkbox 选择查看文件网站!define MUI_FINISHPAGE_SHOWREADME file/url
用户可及点击的超链上的文字!define MUI_FINISHPAGE_LINK link_text
超链上文字的颜,默认为 000080!define MUI_FINISHPAGE_LINK_COLOR
第二部分问题及我的方法
    1、组件选择部分问题
        组件的显示:组件的显示是根据section 定义的顺序,显示的是section的标题,若选择为空,如section “” sec01,它将不会显示在组件选择中。若要实现必选只要在section内定义SectionIn RO即可。
    2、安装路径的问题
        需要用到两个内置变量$INSTDIR
        若要改变安装路径,只需要将安装路径写到注册表中,下次便能方便得读取;
        写入注册表:!define PRODUCT_UNINST_ROOT_KEY "HKLM"
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "" $INSTDIR ;写入注册表
InstallDirRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" ""  ;读取安装路径键值
若要允许安装在根目录下,需要指定:AllowRootDirInstall true
$INSTDIR指定了默认的安装路径,若安装路径呗修改,注册表将会记录修改后的路径,$INSTDIR的值也成为修改后的路径值。
若你需要在安装路径的末尾添加文件夹可用StrCpy $INSTDIR "$INSTDIR\文件夹名"
若用户所在文件夹中已经存在,如修改后会变成  D:\111\111,此时你若只需要一个111,你可以先判断是否存在111文件,判断方为修改后的安装路径名最后几个字符是否与文件名字符想同,相同就不添加文件夹,不相等就自动添加文件夹:
代码:
WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "" $INSTDIR ;写入注册表
StrCpy $1 $INSTDIR ""-6  ;截取最后11个字符
  ${IF} $1 != "ni hao"  ;判断是否安装在”ni hao”文件中
  StrCpy $INSTDIR "$INSTDIR\ni hao"  ;不是,则自动创建文件
  ${EndIf}
  SetOutPath "$INSTDIR"
mui框架常用组件  SetOverwrite ifnewer  ;覆盖
    3、后台执行文件 用nsExec::ExecToLog即可,后面直接加可执行文件
    4、快捷方式的创建
        添加到开始菜单
            CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
            CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$"
              CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载.lnk" "$"
创建桌面快捷方式
    CreateShortCut "$desktop\${PRODUCT_NAME}.lnk" "$"
创建快速启动项
    CreateShortCut "$QUICKLAUNCH\${PRODUCT_NAME}.lnk" "$"
开机立即启动
CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$" "" "$" 0
5、自定义页面
    很多人想要在完成页面添加多个运行程序,但是NSIS默认的只能添加一个,因此,一般我们都采用自定义页面实现,我也不例外。自定义页面需要编写.ini脚本文件
    一般的格式为
    [Settings]
NumFields=3  ;几个小版块
State=0
CancelEnabled=1
NextButtonText=完成
[Field 1]
Type=label
Text="文字版块,可以不添加。
Left=0  ;位置设定
Right=-1
Top=0
Bottom=20
HWND=4981706 ;窗口句柄指定,科以不指定
。。。
使用时,读取并判断checkbox多选框的状态,以执行响应的文件
    ReadINIStr $0 "$PLUGINSDIR\iotemp.ini" "Field 3" "State" ;获取checkbox状态
    ${If} $0 = 1
    CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$" "" "$" 0
  ${EndIf}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。