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