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服务。

 

posted @ 2021-12-30 11:20  吕金良  阅读(2036)  评论(0编辑  收藏  举报