例子源碼掛在github上,如有需要請clone : https://github.com/mox9378/Cpp-Simple-Windows-Service-Example
歡迎 C++/Python 的朋友一起交流學習, My QQ Number: 2303186535
以下附上相關結構體和函數的介紹:
Struct
SERVICE_STATUS結構定義了服務的運行狀態/服務類型/接受的控制形式以及指定錯誤代碼等
1 typedef struct _SERVICE_STATUS { 2 DWORD dwServiceType; //服務類型 3 DWORD dwCurrentState; //當前服務運行狀態 4 DWORD dwControlsAccepted; //接受控制的類型,注冊服務時。此參數默認設置0 5 DWORD dwWin32ExitCode; //指定當服務【開始】/【停止】的退出碼,默認0 6 DWORD dwServiceSpecificExitCode; 默認為0,指定當服務運行或停止錯誤時的代碼,參數會忽略dwWin2ExitCode,除非dwWin2ExitCode指定為ERROR_SERVICE_SPECIFIC_ERROR, 7 DWORD dwCheckPoint; //默認設置0 8 DWORD dwWaitHint; //默認設置0 9 } SERVICE_STATUS, *LPSERVICE_STATUS;
1 typedef struct _QUERY_SERVICE_CONFIG { 2 DWORD dwServiceType; 3 DWORD dwStartType; 4 DWORD dwErrorControl; 5 LPTSTR lpBinaryPathName; 6 LPTSTR lpLoadOrderGroup; 7 DWORD dwTagId; 8 LPTSTR lpDependencies; 9 LPTSTR lpServiceStartName; 10 LPTSTR lpDisplayName; 11 } QUERY_SERVICE_CONFIG, *LPQUERY_SERVICE_CONFIG;
QUERY_SERVICE_CONFIG 和 SERVICE_STATUS 的結構參數類似。
1 typedef struct _ENUM_SERVICE_STATUS { 2 LPTSTR lpServiceName; 3 LPTSTR lpDisplayName; 4 SERVICE_STATUS ServiceStatus; 5 } ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;
ENUM_SERVICE_STATUS 包含服務的名字,顯示名。
1 SC_HANDLE OpenSCManager( 2 LPCTSTR lpMachineName, // computer name 3 LPCTSTR lpDatabaseName, // SCM database name 4 DWORD dwDesiredAccess // access type 5 );
函數:OpenSCManager
打開服務器控制管理器
參數:
lpMachineName //指定計算機的名字,如果為NULL,默認為local,如果是網絡路徑 格式需為已 "\\" 拼接的路徑.
lpDatabaseName //指定打開的數據庫名字,如果為NULL,打開默認的default 服務數據庫。
dwDesiredAccess //指定訪問的方式
返回值:
當函數調用成功,返回已打開的(SC_HANDLE)句柄
1 SC_HANDLE CreateService( 2 SC_HANDLE hSCManager, // handle to SCM database 3 LPCTSTR lpServiceName, // name of service to start 4 LPCTSTR lpDisplayName, // display name 5 DWORD dwDesiredAccess, // type of access to service 6 DWORD dwServiceType, // type of service 7 DWORD dwStartType, // when to start service 8 DWORD dwErrorControl, // severity of service failure 9 LPCTSTR lpBinaryPathName, // name of binary file 10 LPCTSTR lpLoadOrderGroup, // name of load ordering group 11 LPDWORD lpdwTagId, // tag identifier 12 LPCTSTR lpDependencies, // array of dependency names 13 LPCTSTR lpServiceStartName, // account name 14 LPCTSTR lpPassword // account password 15 );
函數:CreateService
左右:用於創建一個服務.
參數介紹:
hSCManager //OpenSCManager打開的句柄
lpServiceName //指定注冊服務的名字
lpDisplayName //指定注冊服務顯示的名字
dwDesiredAccess //指定創建服務所支持的訪問控制
dwServiceType //指定創建的服務的類型
dwStartType //指定服務啟動的類型
dwErrorControl //指定發生錯誤時的錯誤處理方式
lpBinaryPathName // 指定程序的路徑
lpLoadOrderGroup //指定服務所屬組,為NULL則不為任何組
lpdwTagId //當沒有所屬組,此值為NULL
lpDependencies //如果沒有依賴項,此值為NULL
lpServiceStartName //指定為NULL,以localSystem賬戶啟動
lpPassword //當lpServiceStartName 不為NULL,需指定此參數。此參數指定lpServiceStartName的密碼
返回值:
如果函數成功,返回一個SC_HANDLE的實例句柄。
如果函數失敗,返回NULL, 調用GetLastError 獲取錯誤代碼。
1 BOOL EnumServicesStatus( 2 SC_HANDLE hSCManager, // handle to SCM database 3 DWORD dwServiceType, // service type 4 DWORD dwServiceState, // service state 5 LPENUM_SERVICE_STATUS lpServices, // status buffer 6 DWORD cbBufSize, // size of status buffer 7 LPDWORD pcbBytesNeeded, // buffer size needed 8 LPDWORD lpServicesReturned, // number of entries returned 9 LPDWORD lpResumeHandle // next entry 10 );
函數:EnumServicesStatus
枚舉當前已注冊的所有服務,函數可以一次獲取所有服務的信息,所以接收體需要足夠大
參數:
hSCManager //打開的句柄
dwServiceType //要枚舉的服務類型 【SERVICE_WIN32 / SERVICE_DRIVER】
dwServiceState // 要枚舉的狀態
lpServices // out: ENUM_SERVICE_STATUS 結構的輸出參數,a struct = a service info。
cbBufSize //指定 lpServices 的大小,以字節為單位
pcbBytesNeeded // out: 接收實際需要的大小
lpServicesReturned //out: 接收服務的數量
lpResumeHandle // 函數初次調用此參數必須為0,當函數調用成功。此參數為0. 當函數返回為0,GetLastError == ERROR_MORE_DATA 表示指向下一個服務節點的地址以獲取更多附加數據。
返回值:
函數調用成功返回 nonzero.
函數調用失敗返回zero
1 SC_HANDLE OpenService( 2 SC_HANDLE hSCManager, // handle to SCM database 3 LPCTSTR lpServiceName, // service name 4 DWORD dwDesiredAccess // access 5 );
函數:OpenService
打開指定的服務
參數:
hSCManager //句柄
lpServiceName //要打開的服務名
dwDesiredAccess //打開的方式
返回值:
調用成功返回打開的服務的句柄,
調用失敗返回NULL。
1 BOOL QueryServiceConfig( 2 SC_HANDLE hService, // handle to service 3 LPQUERY_SERVICE_CONFIG lpServiceConfig, // buffer 4 DWORD cbBufSize, // size of buffer 5 LPDWORD pcbBytesNeeded // bytes needed 6 );
函數: QueryServiceConfig
查詢服務的詳細信息
參數:
hService //打開服務的句柄
lpServiceConfig // out: 接收服務信息的結構 【QUERY_SERVICE_CONFIG】
cbBufSize // 指定 lpServiceConfig的大小,以字節為單位
pcbBytesNeeded // out: 實際接收的字節數
返回值:
調用成功返回nonzero,
調用失敗返回zero.
1 BOOL QueryServiceConfig2( 2 SC_HANDLE hService, // handle to service 3 DWORD dwInfoLevel, // information level 4 LPBYTE lpBuffer, // buffer 5 DWORD cbBufSize, // size of buffer 6 LPDWORD pcbBytesNeeded // bytes needed 7 );
函數: QueryServiceConfig2
查詢服務的information,具體為描述信息,可以參考 QueryServiceConfig。
1 BOOL QueryServiceStatus( 2 SC_HANDLE hService, // handle to service 3 LPSERVICE_STATUS lpServiceStatus // service status 4 );
函數: QueryServiceStatus
查詢服務的運行狀態
參數:
hService //句柄
lpServiceStatus // out: 一個SERVICE_STATUS 結構的指針,接收服務狀態
返回值:
調用成功返回nonzero,
調用失敗返回zero.
1 BOOL ControlService( 2 SC_HANDLE hService, // handle to service 3 DWORD dwControl, // control code 4 LPSERVICE_STATUS lpServiceStatus // status information 5 );
函數:ControlService
控制服務的運行
參數:
hService // 打開實例的句柄
dwControl //控制的標志
lpServiceStatus // out 一個service_status結構,接收服務的詳細信息
返回值:
調用成功返回nonzero,
調用失敗返回zero.
1 BOOL StartService( 2 SC_HANDLE hService, // handle to service 3 DWORD dwNumServiceArgs, // number of arguments 4 LPCTSTR *lpServiceArgVectors // array of arguments 5 );
函數:
啟動一個已注冊的服務
參數:
hService // 一個打開或創建的句柄
dwNumServiceArgs //服務參數,可為0
lpServiceArgVectors //如果沒有參數傳遞,可以為NULL
返回值:
調用成功返回nonzero,
調用失敗返回zero.
1 BOOL CloseServiceHandle( 2 SC_HANDLE hSCObject // handle to service or SCM object 3 );
函數:
關閉一個打開的服務句柄