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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM