C++Builder在WIN2000環(huán)境下編制Service

字號:

Windows 2000與Windows 9x有一個非常重要的區(qū)別,即Windows 2000提供了很多功能強大的Service(服務(wù))。這些Service可以隨著WIN2000的啟動而自啟動,也可以讓用戶通過控制面板啟動,還可以被Win32應(yīng)用程序起停。甚至在沒有用戶登錄系統(tǒng)的情況下,這些Service也能執(zhí)行。許多FTP、WWW服務(wù)器和數(shù)據(jù)庫就是以Service的形式存在于WIN2000上,從而實現(xiàn)了無人值守。就連最新版的"黑客"程序Back Orifice 2000也是以Service形式在WIN2000上藏身的。由于Service的編程較復(fù)雜,許多開發(fā)者想開發(fā)自己的Service但往往都望而卻步。鑒于此,下面我們就從頭到尾來構(gòu)造一個全新的Service,讀者只要在程序中注明的地方加上自己的代碼,那么就可以輕松擁有一個自己的Service。在編寫Service之前,先介紹一下幾個重要的函數(shù):
    1.
    SC_HANDLE OpenSCManager( LPCTSTR lpMachineName,
     LPCTSTR lpDatabaseName, DWORD dwDesiredAccess)
     OpenSCManager 函數(shù)打開指定計算機上的service control manager database。
     其中參數(shù)lpMachineName指定計算機名,若為空則指定為本機。LpDatabaseName為指
     定要打開的service control manager database名, 默認為空。dwDesiredAccess指定
     操作的權(quán)限, 可以為下面取值之一:
     SC_MANAGER_ALL_ACCESS //所有權(quán)限
     SC_MANAGER_CONNECT //允許連接到service control manager database
     SC_MANAGER_CREATE_SERVICE //允許創(chuàng)建服務(wù)對象并把它加入database
     SC_MANAGER_ENUMERATE_SERVICE //允許枚舉database 中的Service
     SC_MANAGER_LOCK //允許鎖住database
     SC_MANAGER_QUERY_LOCK_STATUS //允許查詢database的封鎖信息
    函數(shù)執(zhí)行成功則返回一個指向service control manager database的句柄,失敗則返回NULL。注意:WIN2000通過一個名為service control manager database的數(shù)據(jù)庫來管理所有的Service,因此對Service的任何操作都應(yīng)打開此數(shù)據(jù)庫。
    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函數(shù)產(chǎn)生一個新的SERVICE。其中參數(shù)hSCManager為指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName為SERVICE的名字,lpDisplayName為Service顯示用名,dwDesiredAccess是訪問權(quán)限,本程序中用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本體程序的路徑名。剩下的五個參數(shù)一般可設(shè)為NULL。如函數(shù)調(diào)用成功則返回這個新Service的句柄,失敗則返回NULL。與此函數(shù)對應(yīng)的是DeleteService( hService),它刪除指定的Service。
    3.
    SC_HANDLE OpenService(SC_HANDLE hSCManager,LPCTSTR lpServiceName, DWORD dwDesiredAccess )
    OpenService函數(shù)打開指定的Service。其中參數(shù)hSCManager為指向service control manager database 的句柄,由OpenSCManager返回。LpServiceName為Service的名字,dwDesiredAccess是訪問權(quán)限,其可選值比較多,讀者可以參看SDK Help. 函數(shù)調(diào)用成功則返回打開的Service句柄,失敗則返回NULL。
    4.
    BOOL StartService( SC_HANDLE hService, DWORD dwNumServiceArgs,LPCTSTR *lpServiceArgVectors )
    StartService函數(shù)啟動指定的Service。其中參數(shù)hService 為指向Service的句柄,由OpenService返回。dwNumServiceAr為啟動服務(wù)所需的參數(shù)的個數(shù)。lpszServiceArgs 為 啟 動 服務(wù)所需的參數(shù)。函數(shù)執(zhí)行成功則返回True, 失敗則返回False。