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