NSIS打包发布WIndowsService(Windows服务)
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服务。