NSIS 入门教程 (二)

news2024/11/29 12:32:39

引言 

在教程的第一部分中创建第一个安装程序后,我们还将需要删除其安装区段中已安装的文件。我们还将展示更多安装引导页面,让用户有机会选择安装的某些部分。 

卸载 

创建一个安装程序.可以干净的卸载,不仅是一种礼貌,对于程序的开发与发行方也有很多好处: 

• 对于更新,首先可以干净地删除旧版本文件。这意味着新版本不再需要的旧文件不会产生任何副作用。 

• 如果用户很难卸载一个他不喜欢的程序,他以后就不太可能尝试我们的其他产品。 

为了将卸载程序添加到教程第一部分的安装程序中,我们复制“第一个安装程序”的脚本并更改/扩展它,使其如下所示:

Name "Second Installer"


OutFile "secondinstaller.exe"
InstallDir $PROGRAMFILES\MySecondInstaller


Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles


Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd


Section "Uninstall"
Delete $INSTDIR\uninstall.exe
Delete $INSTDIR\notepad.exe
RMDir $INSTDIR
SectionEnd

除了将名称更改为“"Second Installer(第二个安装程序)”之外,我们还添加了三条指令: 

UninstPage 

UninstPage 后面两个条目表示应显示两个对话框页面以删除已安装的文件。第一个是卸载确认页面,确认您是否确实要删除已安装的文件,第二个页面显示卸载进度。 

WriteUninstaller 

WriteUninstaller 命令将具有指定名称的卸载程序写入指定文件夹。 

Section "Uninstall" 

此区段用于删除安装。首先,删除使用的是 WriteUninstaller 创建的卸载程序。然后删除安装的文件 (notepad.exe) 和安装目录。 

要显示安装许可证,有专用命令。该命令属性指定包含许可条件的文件(.txt 或.rtf 格式)。该属性允许您自定义显示在安装许可证页面上方的文本。 

Page licenseLicense DataLicenseText 

在很多时候,安装程序正式复制安装文件之前,可能需要查询与核对用户名和密码,这就涉及到自定义验证界面,创建 NSIS 自定义界面,我们有两个插件使用,最早是 InstallOptions + ini 文件,当前已经全部被 nsDialogs 插件替代!此处敲黑板!!但由于篇幅受限,并且作为入门级别的教程,不宜展开讨论自定义页面的制作,此处提及仅仅是为了表述几个常用的函数或者命令,如果想深入了解自定义界面,建议掌握基本入门技巧后,仔细阅读 nsDialogs 帮助文档. 

安装程序脚本中需要调整一些内容,看起来像这样: 

!include nsdialogs.nsh


Name "Third Installer"


OutFile "thirdinstaller.exe"
InstallDir $PROGRAMFILES\MyThirdInstaller


Page license
Page custom getUsername nsDialogsPageLeave
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles


LicenseData "NSIS脚本文件.nsi"
Var Text
Var Dialog
Function ".onInit"
InitPluginsDir
#此处预释放某些安装必需的资源或者文件....
#File /oname=$PLUGINSDIR\name.ini "name.ini"
FunctionEnd


Function getUsername
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 14u 19% 12u "用户名或密码"
${NSD_CreateText} 20% 13u 100% 15u ""
Pop $Text
nsDialogs::Show
FunctionEnd


Function nsDialogsPageLeave
${NSD_GetText} $Text $0
MessageBox MB_OK " 用户名或密码是: $0 "
FunctionEnd


Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd


Section "Uninstall"
Delete $INSTDIR\uninstall.exe
Delete $INSTDIR\notepad.exe
RMDir $INSTDIR
SectionEnd

 

 新知识点的解释: 

Page custom  

使用此命令可以添加自定义页面。参数 getUsername 指定了用于显示该页面的函数名称。该函数将在下文中进行解释。 

Var

为了能够使用全局变量,必须首先声明它们。这里我们提供了两个变量来存储输入的值和自定义页面句柄。 

Function ".onInit" 

这是一个所谓的回调函数。回调函数会在安装程序执行到特定点时被调用。.onInit 会在安装程序几乎完成初始化时调用。 

我们使用这个回调函数将某些安装需要的资源或者文件解压到临时文件夹中。首先使用 InitPluginsDir 命令初始化目录 $PLUGINSDIR。$PLUGINSDIR 是一个临时目录,在安装程序结束时会被删除。接下来,我们将文件复制到这个文件夹中,使其在安装过程中可用。 

Function getUsername 

这是已经提到的功能。核心元素是 nsDialogs 插件调用“Create”函数,创建出一个自定义的用于验证用户名或者密码的自定义界面.此处不再展开讲述! 

在我们的示例中,我们只是使用 MessageBox 显示了这些内容,但您也可以在安装期间将它们写入注册表(使用WriteRegStr命令)。然后应在卸载期间删除写入注册表的值(使用DeleteRegKey或DeleteRegValue)。 

Function nsDialogsPageLeave 

页面离开函数,当该函数被定义,并且用户在本自定义界面点击"下一步"时将会被立即调用,用以处理和验证本自定义界面中用户的输入! 

组件安装与选择,快捷方式和注册表条目与开始菜单创建... 

我们的安装程序仍然缺少三件事: 

• 选择要安装的组件 

• 创建开始菜单条目 

• 在控制面板中添加删除软件的条目 

在我们的第四个安装程序中,我们将满足这些需求。像往常一样,脚本之后会有对代码更改的解释。 

!include nsdialogs.nsh


Name " fourth Installer"


OutFile "fourthinstaller.exe"
InstallDir $PROGRAMFILES\MyFourthInstaller

!define INSTALLATIONNAME "MyForthInstaller"


Page license
Page custom getUsername nsDialogsPageLeave
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles


LicenseData "license.txt"


Var Text
Var Dialog
Function ".onInit"
InitPluginsDir
#此处预释放某些安装必须的资源或者文件....
#File /oname=$PLUGINSDIR\name.ini "name.ini"
FunctionEnd


Function getUsername
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 14u 19% 12u "用户名或密码"


${NSD_CreateText} 20% 13u 100% 15u ""
Pop $Text
nsDialogs::Show
FunctionEnd


Function nsDialogsPageLeave
${NSD_GetText} $Text $0
MessageBox MB_OK " 用户名或密码是: $0 "
FunctionEnd


Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "DisplayName" "Forth Installer"
  WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "UninstallString" '"$INSTDIR\uninstall.exe"'
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoModify" 1
  WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoRepair" 1
SectionEnd


Section "Sample Text File"
  File "license.txt"
SectionEnd


Section /o "Another Sample Text File"
  File "license2.txt"
SectionEnd


Section "Start Menu Shortcuts"
  CreateDirectory "$SMPROGRAMS\${INSTALLATIONNAME}"
  CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
  CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\notepad.lnk" "$INSTDIR\notepad.exe" "" "$INSTDIR\notepad.exe" 0
SectionEnd


Section "Uninstall"
  DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}"
  Delete $INSTDIR\uninstall.exe
  Delete $INSTDIR\notepad.exe
  Delete  $INSTDIR\license.txt
  Delete  $INSTDIR\license2.txt
  RMDir $INSTDIR
  Delete "$SMPROGRAMS\${INSTALLATIONNAME}\*.*"
  RMDir "$SMPROGRAMS\${INSTALLATIONNAME}"
SectionEnd

!define 

使用 !define 我们定义一个包含安装名称的常量。然后我们每次都使用这个常量来代替名称。这意味着我们可以轻松地在一处更改安装名称,并且不会忘记路径等。 

Page component 

此页面命令将显示组件的选择。脚本中的每个区段都是一个组件,可以单独选择和取消选择。名称为空的区段为隐藏区段,隐藏区段始终会被安装. 

Section "Sample Text File" 

一个与可选组件对应的区段,用户可以选择安装或不安装。通常,一个组件默认是选中的,并会相应地进行安装。如果有在正常情况下不需要安装的可选组件,可以使用 /o(表示可选)开关来指定这些组件。 

CreateDirectory 

CreateDirectory 创建指定的目录。如果层次结构中较高的目录尚不存在,本命令会创建它们。 

CreateShortCut 

CreateShortcut 创建具有指定路径和文件名的快捷方式。 

WriteRegStrWriteRegDWORD 

要将值写入注册表,请使用命令 WriteRegStr、WriteRegDWORD 及其相关命令。如果该密钥尚不存在,则会自动创建。 

DeleteRegKey 

相应地,DeleteRegKey 从注册表中删除一个键。 

本章小结

在我们已经介绍了安装程序的主要元素之后,在本教程的第三部分中,我们将研究现代用户界面,以便为安装程序提供更现代的外观。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851053.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【鸿蒙】 模拟器运⾏

【鸿蒙】HUAWEI DevEco Studio安装-CSDN博客 【鸿蒙】创建第⼀个鸿蒙项⽬-CSDN博客 点击 Tools 菜单下的 Device Manager 点击 Install ,安装模拟器 下载模拟器相关的SDK,点击 Finish 选择安装⽬录,点击 New Emulator 选择设备类型&#…

大疆炸机后MOV修复方法(DJI Inspire 3)

dji大疆可以说是无人机中的华为,产品线之广性能之高让高傲的美国人侧面,质量和性价比才是王道。另外产品线的细分也是制胜法宝,无论是手持、农用机、特殊无人机还是影视级产品DJI都有涉及,给人的感觉就是在无人机细分方面它已经无…

LeetCode 算法:排序链表 c++

原题链接🔗:排序链表 难度:中等⭐️⭐️ 题目 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输…

Windows11系统自动获取电脑IPV6地址,并且开机自动发送到指定邮箱

废话:最近放假回家,在家里突然想玩游戏了,Steamdeck性能终归有限。部分游戏始终玩的不爽,想到之前了解到的SunshnieMoonlight串流的方案,远程调用家里的电脑打游戏,简直不要太爽。 一顿折腾之后配置好了所有…

C语言| 数组的顺序查找

顺序查找 查找数组a中第一次出现数字m的下标,并输出该下标; 如果没有则输出sorry。 1 定义变量 数组a,n表示数组的个数, m要查找的数字 2 用sizeof()函数,求出数组元素的个数 3 从键盘中任意输出一个数字m,…

Docker网络介绍

网络是虚拟化技术中最复杂的部分,也是Docker应用中的一个重要环节。 Docker中的网络主要解决容器与容器、容器与外部网络、外部网络与容器之间的互相通信的问题。 这些复杂情况的存在要求Docker有一个强大的网络功能去保障其网络的稳健性。因此,Docker…

象战----第十二届中山市邀请赛正赛

本次的题解一定让大家享受脑细胞碰撞与再生死亡的感受!定然酣畅淋漓!请耐心的读完 简称:让脑袋死机。。。 象战 老规矩先分析在打码: 注意到题目告诉我们:四个角落是不能放的 那么 我们设象在(i,j).(注意&#xff1a…

120.网络游戏逆向分析与漏洞攻防-邮件系统数据分析-邮件发送功能的封装

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

遍历二叉树和线索二叉树

目录 一、*遍历二叉树 1.1遍历定义 1.2遍历目的 1.3遍历用途 1.4遍历方法 1.4.1先序遍历(DLR) 1.4.2中序遍历(LDR) 1.4.3后序遍历(LRD) 1.5根据遍历序列确定二叉树 1.6遍历算法的实现 1.6.1先序遍…

MySQL—索引—基础语法

目录 一、创建、查看以及删除索引的语法 (1)创建索引 1、1会用到一个关键字:CREATE。 1、2增加索引还可以用到另外一个关键字——ALTER TABLE 表名 ADD INDEX ... 。 2、解释。 (2)查看索引 1、查看索引需要用到…

PCL 三次样条插值(二维点)

一、简介 在插值计算中,最简单的分段多项式近似应该是分段线性插值,它由连接一组数据点组成,仅仅只需要将这些点一一用直线进行顺序相连即可。不过线性函数插值的缺点也很明显,就是在两个子区间变化的比较突兀,也就是没有可微性(不够光滑)。因此我们需要更为符合物理情况…

Day58 代码随想录打卡|二叉树篇---将有序数组转换为二叉搜索树

题目(leecode T108): 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 方法:用有序数组构造平衡二叉搜索树,和我们之前有一题的思路差不多&#xff0c…

计算机毕设JAVA——学习考试管理系统(基于SpringBoot+Vue前后端分离的项目)

学习考试管理系统 概要系统架构技术运行环境系统功能项目演示图片 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观,而且功能结构十分单一,存在很多雷同的项目:页面基本上就是套用固定模板,换个颜色、改个文字&#…

如何使用gprof对程序进行性能分析

如何使用gprof对程序进行性能分析 目录 1 gprof概述 2 gprof原理简述 3 gprof使用 3.1 gprof使用简述 3.2 gprof使用示例 4 小结 1 gprof概述 gprof 是 一个 GNU 的程序性能分析工具,可以用于分析C\C程序的执行性能。gprof工具可以统计出各个函数的调用次数、执…

C语言小例程

题目&#xff1a;两个乒乓球队进行比赛&#xff0c;各出三人。甲队为a,b,c三人&#xff0c;乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比&#xff0c;c说他不和x,z比&#xff0c;请编程序找出三队赛手的名单。 #include <stdio.h> #in…

【职场人】职场进化记:我的“不惹人厌邀功精”之路

刚步入职场的我&#xff0c;就像一张白纸&#xff0c;什么都不懂&#xff0c;只知道埋头苦干。但渐渐地&#xff0c;我发现那些经常“冒泡”的同事似乎总能得到更多的关注和机会。我不禁想&#xff1a;“我是否也要成为那样一个‘邀功精’呢&#xff1f;” 不过&#xff0c;我…

BFS:解决最短路问题

文章目录 什么是最短路问题&#xff1f;1.迷宫中离入口最近的出口2.最小基因变化3.单词接龙4.为高尔夫比赛砍树总结 什么是最短路问题&#xff1f; 最短路问题是图论中的经典问题&#xff0c;旨在寻找图中两个节点之间的最短路径。常见的最短路算法有多种&#xff0c;这次我们…

MSPM0G3507——GPIO例程讲解1——input_capture

函数&#xff1a; 参数&#xff1a; 返回值&#xff1a; 主函数代码&#xff1a; #include "ti_msp_dl_config.h"extern volatile uint32_t interruptVectors[];int main(void) {SYSCFG_DL_init(); //把所有的LED灯和按键初始化了一…

idea导入文件里面的子模块maven未识别处理解决办法

1、File → Project Structure → 点击“Modules” → 点击“” → “Import Model” 2、可以看到很多子模块&#xff0c;选择子模块下的 pom.xml 文件导入一个一个点累死了&#xff0c;父目录下也没有pom文件 解决办法&#xff1a;找到子模块中有一个pom.xml文件&#xff0c;…

【CT】LeetCode手撕—42. 接雨水

目录 题目1- 思路2- 实现⭐42. 接雨水——题解思路 3- ACM实现 题目 原题连接&#xff1a;42. 接雨水 1- 思路 模式识别&#xff1a;求雨水的面积 ——> 不仅是只求一个比当前元素大的元素&#xff0c;还要求面积 单调栈 应用场景&#xff0c;需要找到左边比当前元素大的…