定制页面

内置页面的定制

 ”现代用户界面“中提供了一些页面,您可以通过插入宏的指令(如:!insertmacro MUI_PAGE_COMPONENTS)来把相应的页面加入到安装脚本,在安装过程中,插入的页面将按照先后顺序出现,这些提供的安装页面如下: 

MUI_PAGE_WELCOME
MUI_PAGE_LICENSE textfile
MUI_PAGE_COMPONENTS
MUI_PAGE_DIRECTORY
MUI_PAGE_STARTMENU pageid variable
MUI_PAGE_INSTFILES
MUI_PAGE_FINISH 

通过NSIS用户手册我们知道每个内建的页面都有三个回调函数。一个预置函数、一个显示创建函数和一个离开函数。预置函数在页面被创建之前被直接的调用,显示函数在页面被创建后且在显示之前被直接调用,离开函数在用户按下下一页按钮之后并且在页面离开之前被直接调用。

类似的“现代用户界面”,查看NSIS Modern User Interface的页面自定义函数有以下三种类型,它们在插入页面宏之前设置(!insertmacro MUI_PAGE_***):

MUI_PAGE_CUSTOMFUNCTION_PRE function ; 在其间你可以初始化变量或者决定下面插入的页面是否要跳过
MUI_PAGE_CUSTOMFUNCTION_SHOW function ;在其间界面上所有控件的句柄都可以获得,你可以自定义界面的任何部分
MUI_PAGE_CUSTOMFUNCTION_LEAVE function ;在其间可以校验用户的输入

下面是一个例子,对区段变量进行设置(包括对区段组展开,区段设置成只读、选中或不选),体现在组件界面中就是组件的只读、选中或不选:

!define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentsPre
!insertmacro MUI_PAGE_COMPONENTS

; 组件页面函数开始----------------------
Function ComponentsPre
         ; 设置区段选中并且只读
         IntOp $0 ${SF_SELECTED} | ${SF_RO}
         SectionSetFlags ${SEC01} $0
         SectionSetFlags ${SEC02} $0
         SectionSetFlags ${SEC03} $0
         SectionSetFlags ${SEC04} $0

         ; 如果选择启用Exchange功能则选中,否则不选
         ${If} $IsEnableExchange == ${BST_CHECKED}
               SectionSetFlags ${SEC05} $0
         ${Else}
               SectionSetFlags ${SEC05} ${SF_RO}
         ${EndIf}
         ; 如果选择启用Lync功能则选中,否则不选
         ${If} $IsEnableLync == ${BST_CHECKED}
               SectionSetFlags ${SEC06} $0
         ${Else}
               SectionSetFlags ${SEC06} ${SF_RO}
         ${EndIf}
         SectionSetFlags ${SEC07} $0
         ; 设置区段组展开
         IntOp $1 ${SF_SECGRP} | ${SF_EXPAND}
         IntOp $2 $1 | ${SF_RO}
         SectionSetFlags ${SECG01} $2
FunctionEnd
; 组件页面函数结束----------------------

值得提一下的是指令(SectionSetFlags ${SEC01} $0)中变量${SEC01}是区段索引,定义了区段索引的新的区段如下所示:

Section "数据库配置" SEC01
  ; coding
SectionEnd

自定义页面

如果提供的这些内置页面不能满足您的需求,就需要您完全自定义页面了,您的自定义页面想出现在安装过程中,和内置页面一样,需要按照安装页面的的顺序插入页面。插入自定义页面的指令(参考NSIS用户手册,如:Page custom [创建函数] [离开函数] [标题] ),像我们这个实际应用中包含了10个页面,我们按照安装过程中页面出现的顺序插入页面指令,如下代码所示: 

; 安装程序页面开始----------------------
; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 许可页面
!insertmacro MUI_PAGE_LICENSE "Licence.Txt"
; 系统环境检查页面
Page custom SystemEnvironmentCheckInit SystemEnvironmentCheckLeave
; 数据库服务器配置页面
; Page custom DBServiceSettingsInit DBServiceSettingsLeave
; AD服务器配置页面
Page custom ADServiceSettingsInit ADServiceSettingsLeave
; Exchange服务器配置页面
Page custom ExchangeServiceSettingsInit ExchangeServiceSettingsLeave
; Lync服务器配置页面
Page custom LyncServiceSettingsInit LyncServiceSettingsLeave
; 目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 组件页面
!define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentsPre
!insertmacro MUI_PAGE_COMPONENTS
; 安装记录页面
!insertmacro MUI_PAGE_INSTFILES
; 完成页面
!insertmacro MUI_PAGE_FINISH
; 安装程序页面结束----------------------
下面我们以自定义页面”Exchange服务器配置页面“为例来说明怎么创建页面(包含了一系列控件和相关布局),设置控件初始状态、获取控件的数据、校验控件数据来控制下一步动作等。

这个页面中有”是否启用邮箱功能“选项,如果启用邮箱,需要填写Exchange版本、Exchange服务器地址、管理员账户和账户密码等信息,默认是启用邮箱状态,Exchange版本默认是2013,切换”是否启用邮箱功能“选项的状态,会相应的改变邮箱设置的相关信息的可用/不可用状态,如果启用邮箱,信息输入不全则点击下一步时需要有类似”请输入信息再进行下一步安装“的提示,信息输入校验没问题才进行下一步安装。

根据插入的自定义页面指令(Page custom ExchangeServiceSettingsInit ExchangeServiceSettingsLeave),我们知道这里有两个基本的函数,一个是创建函数(ExchangeServiceSettingsInit),一个是离开函数(ExchangeServiceSettingsLeave)。结合需求在创建函数中我们可以创建页面、创建并布局页面上的控件、设置控件初始状态、设置控件动作等,在离开函数中我们可以获取控件数据、校验数据、控制流程走向(是继续下一步还是停止执行脚本)、保存数据等。

在这里我们创建页面使用的是nsDialogs插件(可以参考nsDialogsnsDialogs FAQ),需要包含插件头文件指令(!include nsDialogs.nsh),对应的NSIS安装目录的Plugins文件夹(如:C:\Program Files (x86)\NSIS\Plugins)会有nsDialogs.dll文件。INI文件也可以用来创建自定义页面,但因为INI既不灵活又不高效已经被nsDialogs取代啦。具体的创建页面和控件的指令参考手册说的很清楚了,不再累述。

现在重点说一下创建控件的布局,创建控件的一般指令:${NSD_Create*} x y width height text, 这里面关于控件的定位和大小有四个参数控制,X坐标、Y坐标、宽度和高度,取值可以有三种类型,一种是像素(就是我们通常的px)、一种是对话框单位(必须在数据后加后缀u)、再就是对话框大小的百分比(必须在数据后加后缀%),我这里的建议是使用百分比,这样更好控制布局。

另外一个重点要说的是创建完控件后,会返回一个值放入堆栈中,这个值就是控件的句柄(即HWND),我们以后要设置或获取控件的值等一切针对新创建控件的操作都需要句柄,所以我们需要从堆栈里弹出这个值保存在用户变量中(如指令:Pop $TxtExchangeServerIP),设置控件初始值指令如:${NSD_SetText} $TxtExchangeServerIP “10.0.1.4”,获取控件值如:${NSD_GetText} $TxtExchangeServerIP $ExchangeServerIP等。

针对控件的事件这里我们定义了一个单击事件,如:${NSD_OnClick} $ChxEnableExchange EnableExchangeClick,单击事件处理函数EnableExchangeClick中会根据“是否启用邮箱功能”选项的值来设置其他控件的启用/禁用状态。涉及到选项(如:单选框、复选框)的状态属于两个值中(选中${BST_CHECKED},未选中${BST_UNCHECKED})之一,设置控件的启用/禁用状态使用指令:SendMessage $TxtExchangeServerIP ${EM_SETREADONLY} 0 0/SendMessage $TxtExchangeServerIP ${EM_SETREADONLY} 1 0。

获取文本框控件输入的数据值时我们需要过去掉输入字符串的前后空格和回车换行符等,我们可以自己写一个处理字符串的方法并且宏定义后保存为Trim.nsh文件后使用,当然我们需要先引入头文件(指令:!include Trim.nsh),使用例如:${Trim} $4 $0 第一个参数是处理后的字符串,第二个参数是源字符串。校验输入后我们可以把获取的控件值保存在一个有意义的变量中供其他地方调用,如:StrCpy $ExchangeServerIP $4

下面是完整的创建”Exchange服务器配置页面“的代码,以供参考:

; Exchange服务器配置页面函数开始----------------------
/*设置项:是否启用邮箱功能、Exchange版本默认Exchange 2013、
Exchange服务器地址、管理员账户、账户密码
*/
Var ChxEnableExchange
Var LabExchangeServerIP
Var LabExchangeVersion
Var LabExchangeUser
Var LabExchangeUserPwd
Var TxtExchangeServerIP
Var TxtExchangeVersion
Var TxtExchangeUser
Var TxtExchangeUserPwd
Function ExchangeServiceSettingsInit
         StrCpy $PAGE_TITLE "Exchange服务器配置"
         StrCpy $PAGE_SUBTITLE "当选择启用邮箱功能时,需要输入以下内容(都为必填项):\
         Exchange服务器地址、Exchange版本、管理员账户、账户密码"
         !insertmacro MUI_HEADER_TEXT $PAGE_TITLE $PAGE_SUBTITLE

         nsDialogs::Create 1018
         Pop $Dialog
         ${If} $Dialog == error
               Abort
         ${EndIf}

         ${NSD_CreateGroupBox} 0 0 100% 100% "设置项"
	 Pop $GBox
	 
	 ${NSD_CreateCheckbox} 35% 5% 40% 20% "启用Exchange相关功能"
         Pop $ChxEnableExchange

         ${NSD_CreateLabel} 10% 27% 20% 20% "服务器地址:"
         Pop $LabExchangeServerIP
         
         ${NSD_CreateLabel} 10% 42% 20% 20% "版本:"
         Pop $LabExchangeVersion
         
         ${NSD_CreateLabel} 10% 57% 20% 20% "管理员账户:"
         Pop $LabExchangeUser
         
         ${NSD_CreateLabel} 10% 72% 20% 20% "账户密码:"
         Pop $LabExchangeUserPwd
         
         ${NSD_CreateText} 35% 27% 60% 10% ""
	 Pop $TxtExchangeServerIP
	 
	 ${NSD_CreateText} 35% 42% 60% 10% "2013"
	 Pop $TxtExchangeVersion
	 
	 ${NSD_CreateText} 35% 57% 60% 10% ""
	 Pop $TxtExchangeUser
	 
	 ${NSD_CreatePassword} 35% 72% 60% 10% ""
	 Pop $TxtExchangeUserPwd
         
         SendMessage $TxtExchangeVersion ${EM_SETREADONLY}  1 0
         ${NSD_SetState} $ChxEnableExchange ${BST_CHECKED}
         ${NSD_GetState} $ChxEnableExchange $IsEnableExchange
         ${NSD_OnClick} $ChxEnableExchange EnableExchangeClick
         nsDialogs::Show
FunctionEnd

Function EnableExchangeClick
	${NSD_GetState} $ChxEnableExchange $IsEnableExchange

	${If} $IsEnableExchange == ${BST_CHECKED}
               SendMessage $TxtExchangeServerIP ${EM_SETREADONLY} 0 0
               SendMessage $TxtExchangeUser ${EM_SETREADONLY}     0 0
               SendMessage $TxtExchangeUserPwd ${EM_SETREADONLY}  0 0
        ${Else}
               SendMessage $TxtExchangeServerIP ${EM_SETREADONLY} 1 0
               SendMessage $TxtExchangeUser ${EM_SETREADONLY}     1 0
               SendMessage $TxtExchangeUserPwd ${EM_SETREADONLY}  1 0
	${EndIf}
FunctionEnd

Function ExchangeServiceSettingsLeave
        ${If} $IsEnableExchange == ${BST_UNCHECKED}
              Return
        ${EndIf}
        
        ${NSD_GetText} $TxtExchangeServerIP $0
        ${NSD_GetText} $TxtExchangeVersion  $1
        ${NSD_GetText} $TxtExchangeUser     $2
        ${NSD_GetText} $TxtExchangeUserPwd  $3

        ; ${Trim} $trimmedString $originalString
        ${Trim} $4 $0
        ${Trim} $5 $1
        ${Trim} $6 $2
        ${Trim} $7 $3

        ${If}   $4 == ""
        ${OrIf} $5 == ""
        ${OrIf} $6 == ""
        ${OrIf} $7 == ""
                MessageBox MB_OK "请输入信息再进行下一步安装!"
                Abort
        ${EndIf}
        
        StrCpy $ExchangeServerIP $4
        StrCpy $ExchangeVersion  $5
        StrCpy $ExchangeUser     $6
        StrCpy $ExchangeUserPwd  $7
FunctionEnd
; Exchange服务器配置页面函数结束----------------------

 该自定义页面执行效果截图如下:

 

NSIS 用户手册 新闻、信息、支持、例子、指南等可以到 http://nsis.sf.net 查看。 快速链接: FAQ - 常见问题列表 NSIS Wiki - 例子、函数、指南、插件、软件等等 Forum - 发表你的问题或进行 NSIS 相关讨论 版权所有 (C) 1999-2009 贡献者 第一章: 介绍 NSIS 关于 NSIS 主要特性 特性列表 第二章: 教程: 基础知识 介绍 脚本文件 脚本结构 安装程序属性 页面 区段 函数 脚本的工作方式 逻辑代码结构 变量 调试脚本 脚本的执行 编译器命令 编译器 新式用户界面(Modern UI) 插件 更多 第三章: 命令行的用法 MakeNSIS 的使用 选项 注意事项 环境变量 例子 安装程序的使用 公共选项 卸载程序特殊选项 例子 第四章: 脚本参考 脚本文件格式 变量 用户变量 Var 其他可写的变量 常量 在字符串里使用常量 标记 相对跳转 页面 次序关系 页面选项 回调 Page UninstPage PageEx PageExEnd PageCallbacks 区段 区段命令 AddSize Section SectionEnd SectionIn SectionGroup SectionGroupEnd 卸载区段 函数 函数命令 Function FunctionEnd 回调函数 安装回调 .onGUIInit .onInit .onInstFailed .onInstSuccess .onGUIEnd .onMouseOverSection .onRebootFailed .onSelChange .onUserAbort .onVerifyInstDir 卸载回调 un.onGUIInit un.onInit un.onUninstFailed un.onUninstSuccess un.onGUIEnd un.onRebootFailed un.onSelChange un.onUserAbort 安装程序属性 常规属性 AddBrandingImage AllowRootDirInstall AutoCloseWindow BGFont BGGradient BrandingText Caption ChangeUI CheckBitmap CompletedText ComponentText CRCCheck DetailsButtonText DirText DirVar DirVerify FileErrorText Icon InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType LicenseBkColor LicenseData LicenseForceSelection LicenseText MiscButtonText Name OutFile RequestExecutionLevel SetFont ShowInstDetails ShowUninstDetails SilentInstall SilentUnInstall SpaceTexts SubCaption UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText WindowIcon XPStyle 编译器标记 AllowSkipFiles FileBufSize SetCompress SetCompressor SetCompressorDictSize SetDatablockOptimize SetDateSave SetOverwrite 版本信息 VIAddVersionKey VIProductVersion 指令 基本指令 Delete Exec ExecShell ExecWait File Rename ReserveFile RMDir SetOutPath 注册表、INI 文件指令 DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue EnumRegKey EnumRegValue ExpandEnvStrings FlushINI ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr WriteINIStr WriteRegBin WriteRegDWORD WriteRegStr WriteRegExpandStr 常规用途指令 CallInstDLL CopyFiles CreateDirectory CreateShortCut GetDLLVersion GetDLLVersionLocal GetFileTime GetFileTimeLocal GetFullPathName GetTempFileName SearchPath SetFileAttributes RegDLL UnRegDLL 流程控制指令 Abort Call ClearErrors GetCurrentAddress GetFunctionAddress GetLabelAddress Goto IfAbort IfErrors IfFileExists IfRebootFlag IfSilent IntCmp IntCmpU MessageBox Return Quit SetErrors StrCmp StrCmpS 文件指令 FileClose FileOpen FileRead FileReadByte FileSeek FileWrite FileWriteByte FindClose FindFirst FindNext 卸载程序指令 WriteUninstaller 混合指令 GetErrorLevel GetInstDirError InitPluginsDir Nop SetErrorLevel SetRegView SetShellVarContext Sleep 字符串操作指令 StrCpy StrLen 堆栈支持 Exch Pop Push 整数支持 IntFmt IntOp 重新启动指令 Reboot SetRebootFlag 安装记录指令 LogSet LogText 区段管理 SectionSetFlags SectionGetFlags SectionSetText SectionGetText SectionSetInstTypes SectionGetInstTypes SectionSetSize SectionGetSize SetCurInstType GetCurInstType InstTypeSetText InstTypeGetText 用户界面指令 BringToFront CreateFont DetailPrint EnableWindow FindWindow GetDlgItem HideWindow IsWindow LockWindow SendMessage SetAutoClose SetBrandingImage SetDetailsView SetDetailsPrint SetCtlColors SetSilent ShowWindow 多语言指令 LoadLanguageFile LangString LicenseLangString 多语言 语言选择 LangDLL 插件 RTL 语言 插件 DLLs 使用插件命令 手动调用插件 静默安装程序、卸载程序 第五章: 编译时的命令 编译时的命令 !include !addincludedir !addplugindir !appendfile !cd !delfile !echo !error !execute !packhdr !system !tempfile !warning !verbose 预定义 ${__FILE__} ${__LINE__} ${__DATE__} ${__TIME__} ${__TIMESTAMP__} 范围预定义 ${__GLOBAL__} ${__SECTION__} ${__FUNCTION__} ${__PAGEEX__} ${__UNINSTALL__} 读取环境变量 $%envVarName% 条件编译 !define !undef !ifdef !ifndef !if !ifmacrodef !ifmacrondef !else !endif !insertmacro !macro !macroend !searchparse !searchreplace 附录 A: 新式用户界面(Modern UI) 附录 B: DLL/TLB 库的安装 介绍 库的安装 介绍 参数 选项 LIBRARY_X64 LIBRARY_SHELL_EXTENSION LIBRARY_COM LIBRARY_IGNORE_VERSION 注意事项 例子 取消共享 DLL 共享 DLL 库的卸载 介绍 参数 选项 LIBRARY_X64 LIBRARY_SHELL_EXTENSION LIBRARY_COM 例子 Visual Basic 6 运行库 附录 C: 常用脚本 获取 Internet Explorer 版本 判断 .NET Framework 是否已安装? 判断 Macromedia Flash Player 是否已安装? 连接到 Internet 获取安装程序文件名 禁止多个安装程序实例 更多 Appendix D: 常用信息 错误级别 添加卸载信息到添加/删除程序面板 使用 System.dll 插件来调用一个外部 DLL 把安装详细信息导出到文件 如何读取 REG_MULTI_SZ 值 附录 E: 常用头文件 文件函数头文件 介绍 Locate GetSize DriveSpace GetDrives GetTime GetFileAttributes GetFileVersion GetExeName GetExePath GetParameters GetOptions GetOptionsS GetRoot GetParent GetFileName GetBaseName GetFileExt BannerTrimPath DirState RefreshShellIcons 文本函数头文件 介绍 LineFind LineRead FileReadFromEnd LineSum FileJoin TextCompare TextCompareS ConfigRead ConfigReadS ConfigWrite ConfigWriteS FileRecode TrimNewLines 文字函数头文件 介绍 WordFind WordFindS WordFind2X WordFind2XS WordFind3X WordFind3XS WordReplace WordReplaceS WordAdd WordAddS WordInsert WordInsertS StrFilter StrFilterS VersionCompare VersionConvert 附录 F: 更新纪录和发行说明 2.44 更改日志 主要更改 次要更改 2.43 发行说明 更改日志 次要更改 实用程序和插件 翻译 Plug-in API 构建系统 2.42 发行说明 更改日志 主要更改 次要更改 翻译 构建系统 2.41 更改日志 次要更改 翻译 构建系统 2.40 更改日志 主要更改 次要更改 翻译 2.39 更改日志 主要更改 次要更改 2.38 更改日志 主要更改 次要更改 Modern UI 翻译 2.37 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.36 发行说明 更改日志 主要更改 Modern UI nsDialogs 次要更改 实用程序和插件 翻译 构建系统 2.35 更改日志 主要更改 次要更改 实用程序和插件 2.34 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.33 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.32 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.31 发行说明 更改日志 次要更改 实用程序和插件 翻译 构建系统 2.30 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.29 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.28 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.27 发行说明 更改日志 主要更改 次要更改 构建系统 2.26 发行说明 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.25 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.24 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.23 更改日志 次要更改 实用程序和插件 构建系统 2.22 发行说明 更改日志 次要更改 新/更改的命令 翻译 构建系统 2.21 更改日志 主要更改 次要更改 新/更改的命令 翻译 构建系统 2.20 更改日志 次要更改 翻译 构建系统 2.19 更改日志 次要更改 新/更改的命令 插件 翻译 2.18 更改日志 次要更改 翻译 2.17 更改日志 次要更改 翻译 2.16 发行说明 更改日志 主要更改 新/更改的命令 次要更改 翻译 构建系统 2.15 更改日志 新/更改的命令 次要更改 翻译 构建系统 2.14 发行说明 更改日志 主要更改 次要更改 2.13 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.12 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.11 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.10 更改日志 主要更改 次要更改 翻译 构建系统 2.09 更改日志 主要更改 新/更改的命令 次要更改 翻译 构建系统 2.08 发行说明 更改日志 主要更改 次要更改 构建系统 2.07 发行说明 更改日志 主要更改 新/更改的命令 次要更改 Include Files 实用程序和插件 翻译 2.06 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.05 发行说明 更改日志 新/更改的命令 次要更改 2.04 更改日志 主要更改 次要更改 2.03 发行说明 更改日志 主要更改 新/更改的命令 次要更改 2.02 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.01 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.0 发行说明 更改日志 Changes from 1.98 Changes from RC4 2.0 Release Candidate 4 更改日志 主要更改 次要更改 实用程序和插件 2.0 Release Candidate 3 更改日志 次要更改 实用程序和插件 2.0 Release Candidate 2 更改日志 次要更改 实用程序和插件 2.0 Release Candidate 1 发行说明 更改日志 主要更改 实用程序和插件 2.0 Beta 4 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.0 Beta 3 2.0 Beta 2 2.0 Beta 1 2.0 Beta 0 2.0 Alpha 7 2.0 Alpha 6 2.0 Alpha 5 2.0 Alpha 4 2.0 Alpha 3 2.0 Alpha 2 2.0 Alpha 1 2.0 Alpha 0 旧版本 附录 G: 构建 NSIS 常规构建 在 Windows 上构建 在 POSIX 上构建 每日构建 附录 H: 致谢名单 程序员 资源设计师 翻译人员 文档编写者 附录 I: 许可协议 版权 适用许可协议 zlib/libpng 许可协议 bzip2 许可协议 通用公共许可证 版本1.0 LZMA 压缩模块特殊例外声明 附录 J: 简体中文用户手册说明 致谢 NSIS 交流 NSIS 相关网站 翻译反馈 免责声明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值