程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用C++ Builder在WINNT下編制一個Service

用C++ Builder在WINNT下編制一個Service

編輯:vc教程

Windows NT與Windows 9x有一個非常重要的區別,即Windows NT提供了很多功能強大的Service(服務)。這些Service可以隨著NT的啟動而自啟動,也可以讓用戶通過控制面板啟動,還可以被Win32應用程序起停。甚至在沒有用戶登錄系統的情況下,這些Service也能執行。許多FTP、WWW服務器和數據庫就是以Service的形式存在於NT上,從而實現了無人值守。就連最新版的“黑客”程序Back Orifice 2000也是以Service形式在NT上藏身的。由於Service的編程較復雜,許多開發者想開發自己的Service但往往都望而卻步。鑒於此,下面我們就從頭到尾來構造一個全新的Service,讀者只要在程序中注明的地方加上自己的代碼,那麼就可以輕松擁有一個自己的Service。在編寫Service之前,先介紹一下幾個重要的函數:

1. SC_HANDLE OpenSCManager( LPCTSTR lpMachineName, LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)

OpenSCManager 函數打開指定計算機上的service control manager database。其中參數lpMachineName指定計算機名,若為空則指定為本機。LpDatabaseName為指定要打開的service control manager database名, 默認為空。dwDesiredAccess指定操作的權限, 可以為下面取值之一:

SC_MANAGER_ALL_ACCESS //所有權限

SC_MANAGER_CONNECT //允許連接到service control manager database

SC_MANAGER_CREATE_SERVICE //允許創建服務對象並把它加入database

SC_MANAGER_ENUMERATE_SERVICE //允許枚舉database 中的Service

SC_MANAGER_LOCK //允許鎖住database

SC_MANAGER_QUERY_LOCK_STATUS //允許查詢database的封鎖信息

函數執行成功則返回一個指向service control manager database的句柄,失敗則返回NULL。注意:WINNT通過一個名為service control manager database的數據庫來管理所有的Service,因此對Service的任何操作都應打開此數據庫。

2. SC_HANDLE CreateService(SC_HANDLE hSCManager,

LPCTSTR lpServiceName,

LPCTSTR lpDisplayName,

DWORD dwDesiredAccess,

DWORD dwServiceType,

DWORD dwStartType,

DWORD dwErrorControl,

LPCTSTR lpBinaryPathName,

LPCTSTR lpLoadOrderGroup,

LPDWORD lpdwTagId,

LPCTSTR lpDependencies,

LPCTSTR lpServiceStartName,

LPCTSTR lpPassword)

CreatService函數產生一個新的SERVICE。其中參數hSCManager為指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName為SERVICE的名字,lpDisplayName為Service顯示用名,dwDesiredAccess是訪問權限,本程序中用SERVICE_ALL_ACCESS。wServiceType,指明SERVICE類型,本程序中用SERVICE_WIN32_OWN_PROCESS| SERVICE_INTERACTIVE_PROCESS。dwStartType為Service啟動方式,本程序采用自啟動,即dwStartType等於SERVICE_AUTO_START。 dwErrorControl說明當Service在啟動中出錯時采取什麼動作,本程序采用SERVICE_ERROR_IGNORE即忽約錯誤,讀者可以改為其他的。LpBinaryPathName指明Service本體程序的路徑名。剩下的五個參數一般可設為NULL。如函數調用成功則返回這個新Service的句柄,失敗則返回NULL。與此函數對應的是DeleteService( hService),它刪除指定的Service。

3. SC_HANDLE OpenService(SC_HANDLE hSCManager,LPCTSTR lpServiceName, DWORD dwDesiredAccess )

OpenService函數打開指定的Service。其中參數hSCManager為指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName為Service的名字,dwDesiredAccess是訪問權限,其可選值比較多,讀者可以參看SDK Help. 函數調用成功則返回打開的Service句柄,失敗則返回NULL。

4. BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors )

StartService函數啟動指定的Service。其中參數hService 為指向Service的句柄,由OpenService返回。dwNumServiceAr為啟動服務所需的參數的個數。lpszServiceArgs 為 啟 動 服務所需的參數。函數執行成功則返回True, 失敗則返回False。

5. BOOL ControlService(SC_HANDLE hService DWORD dwControl,LPSERVICE_STATUS lpServiceStatus )

Service程序沒有專門的停止函數,而是用ControlService函數來控制Service的暫停、繼續、停止等操作。參數dwControl指定發出的控制命令,可以為以下幾個值:

SERVICE_CONTROL_STOP //停止Service

SERVICE_CONTROL_PAUSE //暫停Service

SERVICE_CONTROL_CONTINUE //繼續Service

SERVICE_CONTROL_INTERROGATE //查詢Service的狀態

SERVICE_CONTROL_SHUTDOWN //讓ControlService調用失效

參數lpServiceStatus是一個指向SERVICE_STATUS的指針。SERVICE_STATUS是一個比較重要的結構,它包含了Service的各種信息,如當前狀態、可接受何種控制命令等等。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved