C++ (Windows Service)服務編程 - 服務管理


例子源碼掛在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 ); 

函數:

關閉一個打開的服務句柄

 


免責聲明!

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



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