• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            Windows服務(wù)

            Windows服務(wù)是其實一種特殊的二進(jìn)制可執(zhí)行文件,后綴名一般為EXE,之所以說它特殊,因為它具有同Windows   NT/2K系統(tǒng)的服務(wù)控制管理器(SCM:   Service   Control   Manager)通信。  
                      服務(wù)控制管理器通過維護(hù)數(shù)據(jù)庫對已經(jīng)安裝到系統(tǒng)的所有服務(wù)和驅(qū)動程序進(jìn)行統(tǒng)一而安全的控制和管理。服務(wù)控制管理器是一個遠(yuǎn)程進(jìn)程調(diào)用(RPC)服務(wù)器,在系統(tǒng)導(dǎo)入時自動啟動。  
                      一個簡單的服務(wù)程序至少包括一些幾個部分:  
                    1.   Win32/控制臺應(yīng)用主程序;  
                    2.   一個服務(wù)主程序,作為服務(wù)的導(dǎo)入點;  
                    3.   一個服務(wù)控制處理器,就是同服務(wù)控制管理器SCM通信的函數(shù);  
                    4.   一個服務(wù)安裝/反安裝程序用于將一個EXE文件注冊為一個服務(wù)。  
                    下面我們針對上述幾個部分分別介紹怎樣構(gòu)造一個Windows服務(wù)。  
               
              控制臺應(yīng)用主程序  
               
              在Win32下為WinMain函數(shù),在控制臺下為main函數(shù),是服務(wù)的主程序。下面是服務(wù)主程序中至少要包含的語句。  
              #include   "Winsvc.h"                                                 //服務(wù)頭文件  
              main()  
              {  
                      ......  
                      SERVICE_TABLE_ENTRY   Table[]={{"gkeyService",gkeyServiceMain},{NULL,NULL}};      
                      StartServiceCtrlDispatcher(Table);    
                              ......  
              }  
              當(dāng)然這是一個非常簡單的主程序了。這里main只做了一件事情,就是填寫SERVICE_TABLE_ENTRY結(jié)構(gòu)數(shù)組Table。Table[0][0]是服務(wù)的名字(可以是您喜歡的任意字符串,此處我用的是gkeyService);Table[0][1]指定了服務(wù)主程序的名字,實際上這是一個指向服務(wù)主程序的函數(shù)指針,它也可以用您喜歡的函數(shù)名字(我用的是gkeyServiceMain)。現(xiàn)在通過調(diào)用參數(shù)為SERVICE_TABLE_ENTRY結(jié)構(gòu)數(shù)組的函數(shù)StartServiceCtrlDispatcher()開始啟動服務(wù)解析。注意這個函數(shù)的參數(shù)必須要符合一定的格式,Table[1][0]和Table[1][1]必須是NULL,就是說到了數(shù)組的結(jié)尾。當(dāng)然并非必須這樣,如果需要在這個執(zhí)行程序中運行多個服務(wù),可以在這個數(shù)組列表中加入更多的入口,構(gòu)成多對服務(wù)名稱和服務(wù)中程序,自然您需要在以下的步驟中需要為每個服務(wù)構(gòu)造相應(yīng)的完成函數(shù)。  
               
              服務(wù)主程序  
              典型的服務(wù)主程序的聲明如下:  
              void   WINAPI   gkeyServiceMain(   DWORD   argc,   LPTSTR   *argv   )  
               
                      在gkeyServiceMain函數(shù)中,需要實現(xiàn)的主要步驟包括:    
              1.   用合適的值填寫SERVICE_STATUS結(jié)構(gòu)來完成同服務(wù)控制管理器SCM的通信;  
              2.   在列表中注冊前面所說的服務(wù)控制處理函數(shù);  
              3.   調(diào)用實際的處理函數(shù)。  
               
                      為了完成上述功能,需要使用兩個全局變量:  
              SERVICE_STATUS                   m_ServiceStatus;  
              SERVICE_STATUS_HANDLE           m_ServiceStatusHandle;  
               
                      服務(wù)主程序gkeyServiceMain()能夠象通常的c/c++里的main()函數(shù)一樣接受命令行參數(shù),并且接受參數(shù)的方式也完全一樣。第一個參數(shù)argc包含了傳遞給服務(wù)的參數(shù)個數(shù),同c/c++的main()一樣至少有一個參數(shù)就是服務(wù)應(yīng)用本身。第二個參數(shù)是一個字符指針數(shù)組的指針。同main()函數(shù)一樣,數(shù)組的第一個值總是指向服務(wù)的名字。  
                      使用SERVICE_STATUS數(shù)據(jù)結(jié)構(gòu)記錄服務(wù)的當(dāng)前狀態(tài),并將狀態(tài)及時通告給服務(wù)控制管理器SCM,使用一個API函數(shù)SetServiceStatus()來實現(xiàn)這一目標(biāo)。SERVICE_STATUS的數(shù)據(jù)成結(jié)構(gòu)員如下:  
               
              dwServiceType                 =   SERVICE_WIN32;                    
              dwCurrentState               =  
            SERVICE_START_PENDING;   //   試圖啟動(初始狀態(tài))  
              dwControlsAccepted       =   SERVICE_ACCEPT_STOP;       //   僅接收服務(wù)控制程序的啟動/停止,服務(wù)控制程序通常在  
               
              Windows   NT下的控制面板或者Windows   2K下的管理工具,我們也可以設(shè)置服務(wù)接受暫停/繼續(xù)功能。  
               
                      在服務(wù)主程序gkeyServiceMain()的開始應(yīng)該設(shè)置SERVICE_STATUS的狀態(tài)字段dwCurrentState為SERVICE_START_PENDING,通知SCM服務(wù)處于運行狀態(tài)。如果發(fā)生錯誤,應(yīng)該發(fā)送SERVICE_STOPPED通知服務(wù)控制管理器SCM。缺省狀態(tài)下,服務(wù)控制管理器SCM將監(jiān)視服務(wù)的活動,如果2分鐘之類沒有發(fā)現(xiàn)進(jìn)程活動就殺死這個服務(wù)。  
                      使用API函數(shù)RegisterServiceCtrlHandler()設(shè)置服務(wù)控制管理器SCM的服務(wù)控制處理函數(shù),這個函數(shù)需要兩個參數(shù),一個是服務(wù)名稱字符串,一個是服務(wù)控制處理函數(shù)句柄。  
                      現(xiàn)在要設(shè)置dwCurrentState為SERVICE_RUNNING用以通知服務(wù)已經(jīng)啟動。  
               
              服務(wù)控制處理函數(shù)  
               
                      服務(wù)控制管理器SCM使用服務(wù)控制處理函數(shù)和服務(wù)程序進(jìn)行通信來了解服務(wù)的諸如啟動、停止、暫停或繼續(xù)等用戶指令,它主要包含一個switch語句來處理每種情況,調(diào)用相應(yīng)的步驟來啟動、急需、清除和中斷進(jìn)程。函數(shù)收到一個象SERVICE_CONTROL_PAUSE,   SERVICE_CONTROL_CONTINUE,   SERVICE_CONTROL_STOP,   SERVICE_CONTROL_INTERROGATE等操作碼,就需要為每種指令提供相應(yīng)的處理步驟。  
               
              安裝/反安裝  
               
                      要安裝一個服務(wù),在系統(tǒng)注冊時需要生成一些入口,通常使用Windows有現(xiàn)成的API而不是注冊函數(shù)來完成這些步驟,這些函數(shù)有CreateService()和DeleteService()。為了安裝服務(wù),首先使用OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS)打開服務(wù)控制管理器SCM。然后調(diào)用CreateService()來建立服務(wù),給出服務(wù)的名字,如果要刪除指定的服務(wù),也將需要使用這個名字刪除。  
               
              例子代碼如下:  
              //   創(chuàng)建服務(wù)  
              String   strSrvName   =   Application->ExeName;  
              SC_HANDLE   schService   =   CreateService(  
                              scm,  
                              "ccrunSrv",                       //   服務(wù)名稱  
                              "ccrun's   Service",         //   服務(wù)詳細(xì)說明  
                              SERVICE_ALL_ACCESS,  
                              SERVICE_WIN32_OWN_PROCESS   |   SERVICE_INTERACTIVE_PROCESS,  
                              SERVICE_AUTO_START,       //   以自動方式開始  
                              SERVICE_ERROR_NORMAL,  
                              strSrvName.c_str(),       //   Service本體程序路徑,必須與具體位置相符  
                              NULL,  
                              NULL,  
                              NULL,  
                              NULL,  
                              NULL);  
              if(schService   !=   NULL)  
              {  
                      CloseServiceHandle(schService);  
              }  
              //---------------------------------------------------------------------------  
              //   開始Service  
              sHandle   =   OpenService(scm,   "ccrunSrv",   SERVICE_START);  
              if(sHandle!=NULL)  
              {  
                      StartService(sHandle,   0,   NULL);  
                      CloseServiceHandle(sHandle);  
              }  
              //---------------------------------------------------------------------------  
              //   關(guān)閉服務(wù)管理器  
              CloseServiceHandle(scm);  

            posted on 2007-12-21 10:16 大龍 閱讀(1336) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            97香蕉久久夜色精品国产 | 狠狠色丁香婷婷综合久久来| 久久久久久久波多野结衣高潮 | 丁香久久婷婷国产午夜视频| 久久久久国产成人精品亚洲午夜| 亚洲国产精品综合久久网络| 久久久精品2019免费观看| 久久精品无码免费不卡| 无码超乳爆乳中文字幕久久| 久久久久18| 青青青国产精品国产精品久久久久| 亚洲一级Av无码毛片久久精品| 久久精品无码午夜福利理论片| 一本大道久久东京热无码AV| 久久国产精品99精品国产987| 久久精品国产男包| 色婷婷狠狠久久综合五月| 国产精品久久久久影院色| 亚洲中文久久精品无码ww16| 欧美精品福利视频一区二区三区久久久精品 | 久久精品无码一区二区WWW| 成人精品一区二区久久| 久久人妻少妇嫩草AV无码专区| 色偷偷88欧美精品久久久 | 国产巨作麻豆欧美亚洲综合久久| 亚洲中文精品久久久久久不卡| 无码任你躁久久久久久| 国产三级观看久久| 久久精品国产秦先生| 成人国内精品久久久久影院| 久久精品无码专区免费青青| 婷婷久久久亚洲欧洲日产国码AV| 国产精品一区二区久久精品涩爱| 久久久久无码专区亚洲av| 久久93精品国产91久久综合| 2021国产成人精品久久| 国内精品久久久久久久久| 久久精品国产亚洲7777| 色婷婷久久久SWAG精品| 久久亚洲AV成人无码| 色婷婷综合久久久久中文|