已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
windows NT與Windows 9x有一個非常重要的區(qū)別,即Windows NT提供了很多功能強大的Service(服務(wù))。這些Service可以隨著NT的啟動而自啟動,也可以讓用戶通過控制面板啟動,還可以被Win32應(yīng)用程序起停。甚至在沒有用戶登錄系統(tǒng)的情況下,這些Service也能執(zhí)行。許多FTP、WWW服務(wù)器和數(shù)據(jù)庫就是以Service的形式存在于NT上,從而實現(xiàn)了無人值守。就連最新版的“黑客”程序Back Orifice 2000也是以Service形式在NT上藏身的。由于Service的編程較復雜,許多開發(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。注意:WINNT通過一個名為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。 - 5. BOOL ControlService(SC_HANDLE hService DWORD dwControl,LPSERVICE_STATUS lpServiceStatus ) - Service程序沒有專門的停止函數(shù),而是用ControlService函數(shù)來控制Service的暫停、繼續(xù)、停止等操作。參數(shù)dwControl指定發(fā)出的控制命令,可以為以下幾個值: SERVICE_CONTROL_STOP /停止Service SERVICE_CONTROL_PAUSE /暫停Service SERVICE_CONTROL_CONTINUE /繼續(xù)Service SERVICE_CONTROL_INTERROGATE /查詢Service的狀態(tài) SERVICE_CONTROL_SHUTDOWN /讓ControlService調(diào)用失效 - 參數(shù)lpServiceStatus是一個指向SERVICE_STATUS的指針。SERVICE_STATUS是一個比較重要的結(jié)構(gòu),它包含了Service的各種信息,如當前狀態(tài)、可接受何種控制命令等等。 - 6. BOOL QueryServiceStatus( SC_HANDLE hService,LPSERVICE_STATUS lpServiceStatus ) - QueryServiceStatus函數(shù)比較簡單,它查詢并返回當前Service的狀態(tài)。 - 編制一個Service一般需要兩個程序,一個是Service本體,一個是用于對Service進行控制的控制程序。通常Service本體是一個console程序,而控制程序則是一個普通的Win32應(yīng)用程序(當然,用戶不用控制程序而通過控制面板也可對Service進行啟、停,但不能進行添加、刪除操作。) - 首先,我們來編寫Service本體。對于Service本體來說,它一般又由以下三部分組成:main()、ServiceMain()、Handler(),下面是main()的源代碼:(注:由于篇幅的關(guān)系,大部分程序都沒進行錯誤處理,讀者可以自己添上) int main(int argc, char *argv) SERVICE_TABLE_ENTRY ste2; /一個Service進程可以有多個線程,這是每個 /線程的入口表 ste0.lpServiceName= W.Z.SERVICE ; /線程名字 ste0.lpServiceProc=ServiceMain; /線程入口地址 ste1.lpServiceName=NULL; /最后一個必須為NULL ste1.lpServiceProc=NULL; StartServiceCtrlDispatcher(ste); return 0; - main()是Service的主線程。當servie control manager開始一個Service進程時,它總是等待這個Service去調(diào)用StartServiceCtrlDispatcher()函數(shù)。main( )作為這個進程的主線程應(yīng)該在程序開始后盡快調(diào)用StartServiceCtrlDispatcher()。StartServiceCtrlDispatcher()在被調(diào)用后并不立即返回,它把本Service的主線程連接到service control manager,從而讓service control manager通過這個連接發(fā)送開始、停止等控制命令給主線程。主線程在這時就扮演了一個命令的轉(zhuǎn)發(fā)器的角色,它或者調(diào)用Handle( )去處理停止、繼續(xù)等控制要求,或者產(chǎn)生一個新線程去執(zhí)行ServiceMain。StartServiceCtrlDispatcher()在整個Service結(jié)束時才返回。 - ServiceMain()是Service真正的入口點,必須在main()中進行了正確的定義。ServiceMain( )的兩個參數(shù)是由StartService()傳遞過來的。下面是ServiceMain()的源代碼:void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv) ssh=RegisterServiceCtrlHandler ( W.Z.SERVICE ,Handler); ss.dwServiceType=SERVICE_WIN32_OWN _PROCESS|SERVICE_INTERACTIVE_PROCESS; ss.dwCurrentState=SERVICE_START_PENDING; /如用戶程序的代碼比較多 (執(zhí)行時間超過1秒),這兒要設(shè)成SERVICE_ START_PENDING,待用戶程序完成后再設(shè)為SERVICE_RUNNING。 ss.dwControlsAccepted=SERVICE_ACCEPT_ STOP;/表明Service目前能接受的命令是停止命令。 ss.dwWin32ExitCode=NO_ERROR; ss.dwCheckPoint=0; ss.dwWaitHint=0; SetServiceStatus(ssh, &ss); /必須隨時更新數(shù)據(jù)庫中Service的狀態(tài)。 Mycode(); /這兒可放入用戶自己的代碼 ss.dwServiceType=SERVICE_WIN32_OWN_ PROCESS|SERVICE_INTERACTIVE_PROCESS; ss.dwCurrentState=SERVICE_RUNNING; ss.dwControlsAccepted=SERVICE_ACCEPT_STOP; ss.dwWin32ExitCode=NO_ERROR; ss.dwCheckPoint=0; ss.dwWaitHint=0; SetServiceStatus(ssh,&ss); Mycode();/ 這兒也可放入用戶自己的代碼 在ServiceMain()中應(yīng)該立即調(diào)用 RegisterServiceCtrlHandler()注冊一個Handler 去處理控制程序或控制面板對Service的控制要求。 Handler()被轉(zhuǎn)發(fā)器調(diào)用去處理要求, 下面是Handler()的源代碼: void WINAPI Handler(DWORD Opcode) switch(Opcode) case SERVICE_CONTROL_STOP: /停止Service Mycode();/這兒可放入用戶自己的相關(guān)代碼 ss.dwWin32ExitCode = 0; ss.dwCurrentState =SERVICE_STOPPED; /把Service的當前狀態(tài)置為STOP ss.dwCheckPoint = 0; ss.dwWaitHint = 0; SetServiceStatus (ssh,&ss); /必須隨時更新數(shù)據(jù)庫中Service的狀態(tài) break; case SERVICE_CONTROL_INTERROGATE: SetServiceStatus (ssh,&ss); /必須隨時更新數(shù)據(jù)庫中Service的狀態(tài) break; - 好了,Service本體程序已基本完成,我們接著來看一下Service的控制程序: - 控制程序是一個標準的window程序,上面主要有四個按紐:Create Service、Delete Service、start、stop,分別用來產(chǎn)生、刪除、開始和停止Service。下面是它們的部分源代碼: 1. 產(chǎn)生Service void _fastcall TForm1:CreateBtnClick (TObject *Sender) scm=OpenSCManager(NULL,NULL, SC_MANAGER_CREATE_SERVICE); if (scm!=NULL) svc=CreateService(scm, W.Z.SERVICE , W.Z.SERVICE ,/Service名字 SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS |SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, /以自動方式開始 SERVICE_ERROR_IGNORE, C:ntservice.exe , /Service本體程序路徑, 必須與具體位置相符 NULL,NULL,NULL,NULL,NULL); if (svc!=NULL) CloseServiceHandle(svc); CloseServiceHandle(scm); 2. 刪除Service void _fastcall TForm1:DeleteBtnClick (TObject *Sender) scm=OpenSCManager(NULL,NULL, SC_MANAGER_CONNECT); if (scm!=NULL) svc=OpenService(scm, W.Z.SERVICE , SERVICE_ALL_ACCESS); if (svc!=NULL) QueryServiceStatus(svc,&ServiceStatus); if (ServiceStatus.dwCurrentState= SERVICE_RUNNING)/刪除前,先停止此Service. ControlService(svc, SERVICE_CONTROL_STOP,&ServiceStatus); DeleteService(svc); CloseServiceHandle(svc); /刪除Service后,最好再調(diào)用CloseServiceHandle /以便立即從數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個人住宅水電安全檢測與維修服務(wù)合同4篇
- 2024年企業(yè)、公司經(jīng)營管理戰(zhàn)略方案及技巧知識考試題庫(附含答案)
- 2025版探礦權(quán)轉(zhuǎn)讓協(xié)議范本:礦產(chǎn)資源合作開發(fā)新策略3篇
- 2025版新能源產(chǎn)業(yè)園區(qū)土地合作開發(fā)協(xié)議書3篇
- 2025版施工安全協(xié)議書:高空作業(yè)安全協(xié)議范本3篇
- 二零二五年度車輛租賃合同車輛租賃保險條款4篇
- 合作式學習在小學數(shù)學課堂中的應(yīng)用案例
- 2025版文藝團體演出合作委托合同3篇
- 跨文化交流拓寬視野培養(yǎng)孩子獨立見解
- 甘肅2025年甘肅西北師范大學誠聘海內(nèi)外高層次人才160人筆試歷年參考題庫附帶答案詳解
- 醫(yī)院6s管理成果匯報護理課件
- 泵站運行管理現(xiàn)狀改善措施
- 2024屆武漢市部分學校中考一模數(shù)學試題含解析
- SYT 0447-2014《 埋地鋼制管道環(huán)氧煤瀝青防腐層技術(shù)標準》
- 第19章 一次函數(shù) 單元整體教學設(shè)計 【 學情分析指導 】 人教版八年級數(shù)學下冊
- 浙教版七年級下冊科學全冊課件
- 弧度制及弧度制與角度制的換算
- 瓦楞紙箱計算公式測量方法
- 江蘇省中等職業(yè)學校學業(yè)水平考試商務(wù)營銷類(營銷方向)技能考試測試題
- DB32-T 4004-2021水質(zhì) 17種全氟化合物的測定 高效液相色譜串聯(lián)質(zhì)譜法-(高清現(xiàn)行)
- DB15T 2724-2022 羊糞污收集處理技術(shù)規(guī)范
評論
0/150
提交評論