NSIS软件
采用NSIS + HM NIS Edit + ,制作安装程序实际上就是使用HM NIS Edit制作安装程序,而NSIS仅仅将制作的安装程序打包成一个exe。
下载
NSIS 下载地址:https://nsis.sourceforge.io/Download
HM NIS Edit 下载地址:http://hmne.sourceforge.net/
NSIS_Simple_Service_Plugin下载地址:https://nsis.sourceforge.io/NSIS_Simple_Service_Plugin
安装NSIS





安装HM NSIS Edit
打开链接http://hmne.sourceforge.net,下载页面:

安装过程:





安装NSIS Simple Service Plugin
下载地址:https://nsis.sourceforge.io/NSIS_Simple_Service_Plugin

上面图中的两个版本挑选一种下载即可,两个都下载也不会有问题。下载完成后,将压缩包中的SimpleSC.dll解压到NSIS安装目录的Plugins文件夹 中,如果你下载的是NSIS_Simple_Service_Plugin的ANSI版本,那就放在NSIS/Plugins/x86-ansi文件夹下;如果你下载的是NSIS_Simple_Service_Plugin的Unicode版本,那就放在NSIS\Plugins\x86-unicode文件夹中。
NSIS_Simple_Service_Plugin的ANSI版本


NSIS_Simple_Service_Plugin的Unicode版本


打包WIndowsService程序
打开HM NIS Edit程序,选择文件==>新建脚本:向导,依次如下图操作:



下图中的授权文件,如果没有,则清空文本框即可

下图中的两个示例文件,删除即可


下图中圈出来的按钮,左边的按钮是直接选择文件,右边的按钮时根据目录选择文件

我选择的是根据目录选择文件

选择你的windows服务的程序编译目录,Debug文件夹或者Release文件夹



下图中的文本框1是选择可执行文件(因为我打包的程序是Windows服务 所以不需要程序安装后运行,则将此文本框的内容删除即可),剩下两个文件框不懂啥意思,



选择你自己的脚本存放目录以及文件名


到目前为止,程序可以打包了。但是我们还需要将此服务注册电脑系统的服务中,所以还需要以下步骤:
1.添加注册服务的脚本到安装节点:
以下圈出来的代码,意思是先检测服务是不是已经存在,是不是正在运行中,目的是为了将现有的服务删除,再重新注册

附检测服务的命令:
; Check if the service exists
SimpleSC::ExistsService "JiXiaoNotifyPush"
Pop $0 ; 0:服务已经存在;不是0,服务不存在
;如果服务已经存在
${If} $0 == 0
Push $0
; Check if the service is running
SimpleSC::ServiceIsRunning "JiXiaoNotifyPush"
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
Pop $1 ; returns 1 (service is running) - returns 0 (service is not running)
;如果检测服务是否正在运行成功
${If} $0 == 0
Push $0
;如果服务正在运行中
${If} $1 == 1
;关闭服务
SimpleSC::StopService "JiXiaoNotifyPush" 1 30
Pop $0 ; returns an errorcode (<>0) otherwise success (0)
;如果服务关闭成功
${If} $0 == 0
;删除服务
DetailPrint "Removing JiXiaoNotifyPush Client service..."
SimpleSC::RemoveService "JiXiaoNotifyPush"
;如果服务关闭不成功
${ElseIf} $0 != 0
Push $0
;获取服务关闭不成功的系统错误信息
SimpleSC::GetErrorMessage
Pop $0
;将信息弹窗展示给用户
MessageBox MB_OK|MB_ICONSTOP "JiXiaoNotifyPush服务关闭失败($0)"
${EndIf}
;如果服务没有正在运行中
${ElseIf} $1 == 0
;删除服务
DetailPrint "Removing JiXiaoNotifyPush Client service..."
SimpleSC::RemoveService "JiXiaoNotifyPush"
${EndIf}
;如果检测服务是否正在运行不成功
${ElseIf} $0 != 0
Push $0
SimpleSC::GetErrorMessage
Pop $0
MessageBox MB_OK|MB_ICONSTOP "检测JiXiaoNotifyPush服务是否正在运行失败($0)"
${EndIf}
${EndIf}
在安装节点的末尾,写入注册服务的脚本

附注册服务命令:
#安装服务
DetailPrint "Installing JiXiaoNotifyPush Client service..."
SimpleSC::InstallService "JiXiaoNotifyPush" "JiXiaoNotifyPush" "16" "2" "$INSTDIR\JiXiaoNotifyPush.exe" "" "" ""
Pop $0
;如果安装不成功
${If} $0 != 0
Push $0
;获取不成功的系统错误信息
SimpleSC::GetErrorMessage
Pop $0
;将信息弹窗展示给用户
MessageBox MB_OK|MB_ICONSTOP "JiXiaoNotifyPush服务安装失败($0),请手动注册"
${EndIf}
#启动服务
DetailPrint "Starting JiXiaoNotifyPush Client service..."
SimpleSC::StartService "JiXiaoNotifyPush" "" 30
Pop $0
${If} $0 != 0
Push $0
SimpleSC::GetErrorMessage
Pop $0
MessageBox MB_OK|MB_ICONSTOP "JiXiaoNotifyPush服务启动失败($0)"
${EndIf}
题外话:简单说下命令参数的意思,中括号里面的都是参数
SimpleSC::InstallService [name_of_service] [display_name] [service_type] [start_type] [binary_path] [dependencies] [account] [password]
SimpleSC::StartService [name_of_service] [arguments] [timeout]
SimpleSC::StopService [name_of_service] [wait_for_file_release] [timeout]
SimpleSC::RemoveService [name_of_service]
- name_of_service - 用于启动/停止命令和所有其他命令的服务的名称
- display_name - 系统控制中服务控制管理器中显示的名称
- service_type - 以下代码之一
- 1 - SERVICE_KERNEL_DRIVER - 驱动程序服务。
- 2 - SERVICE_FILE_SYSTEM_DRIVER - 文件系统驱动服务。
- 16 - SERVICE_WIN32_OWN_PROCESS - 在自己的进程中运行的服务。(应该在大多数情况下使用)
- 32 - SERVICE_WIN32_SHARE_PROCESS - 与一个或多个其他服务共享进程的服务。
- 256 - SERVICE_INTERACTIVE_PROCESS - 服务可以与桌面交互。
- 注意:如果您指定 SERVICE_WIN32_OWN_PROCESS 或 SERVICE_WIN32_SHARE_PROCESS,并且服务在 LocalSystem 帐户的上下文中运行,您也可以指定此值。示例:SERVICE_WIN32_OWN_PROCESS 或 SERVICE_INTERACTIVE_PROCESS -(16 或 256)= 272
- 注意:从 Windows Vista 开始,服务无法直接与用户交互。因此,不应在新代码中使用此技术。有关更多信息,请参见:http : //msdn2.microsoft.com/en-us/library/ms683502(VS.85).aspx
- binary_path - 服务的目录,参数中的$INSTDIR是根目录的意思
- start_type - 以下代码之一
- 0 - SERVICE_BOOT_START - 驱动程序启动阶段开始
- 1 - SERVICE_SYSTEM_START - 驱动程序 scm 阶段开始
- 2 - SERVICE_AUTO_START - 服务自动启动(应该在大多数情况下使用)
- 3 - SERVICE_DEMAND_START - 驱动程序/服务手册启动
- 4 - SERVICE_DISABLED - 驱动程序/服务被禁用
- wait_for_file_release - 服务停止后等待文件释放。如果在停止服务后二进制文件将被覆盖,这将很有用。
- 0 - NO_WAIT - 不等待文件发布
- 1 - WAIT - 等待文件发布
- 注意:如果使用 SERVICE_WIN32_OWN_PROCESS,则此选项应设置为 WAIT。如果 SERVICE_WIN32_SHARE_PROCESS 被使用,这个选项应该只在进程中的最后一个服务停止时设置为 WAIT。
2.添加关闭删除服务的命令到卸载程序的节点下:

最后点击下图中的按钮(编译并运行),就可以看到已经打包的文件了


双击Setup.exe文件,选择安装目录,然后就可以在服务列表中看到我们编写的windows服务。
