• <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>

            yehao's Blog

            后臺服務(wù)程序開發(fā)模式(二)

            轉(zhuǎn)自http://www.7880.com/Info/Article-5a903440.html

            2.服務(wù)入口點(diǎn)函數(shù)

             

            服務(wù)入口點(diǎn)函數(shù) service_main 首先調(diào)用系統(tǒng)函數(shù) RegisterServiceCtrlHandler 注冊服務(wù)控制處理函數(shù) service_ctrl,然后調(diào)用 ReportStatusToSCMgr 函數(shù),它通過系統(tǒng)函數(shù) SetServiceStatus 更新服務(wù)的狀態(tài),然后調(diào)用特定的服務(wù)初始化入口函數(shù) ServiceStart 完成具體的初始化工作。

             

             

            //服務(wù)入口點(diǎn)函數(shù)

            void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具體服務(wù)的初始化入口函數(shù)
             
            void  WINAPI  Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)

            {

                 //注冊服務(wù)控制處理函數(shù)

                 sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);

                 //如果注冊失敗

                 if(!sshStatusHandle)

                 {

                     goto cleanup;

                     return;

                 }

                 //初始化 SERVICE_STATUS 結(jié)構(gòu)中的成員

                 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;

                 ssStatus.dwServiceSpecificExitCode=0;

                 //更新服務(wù)狀態(tài)

                 if(!ReportStatusToSCMgr(

                     SERVICE_START_PENDING,//服務(wù)狀態(tài),The service is starting.

                     NO_ERROR,            //退出碼        

                     3000))                   //等待時間

                     goto cleanup;        //更新服務(wù)狀態(tài)失敗則轉(zhuǎn)向 cleanup

                 ServiceStart(dwArgc,lpszArgv);

                 return;

            cleanup:

                 //把服務(wù)狀態(tài)更新為 SERVICE_STOPPED,并退出。

                 if(sshStatusHandle)

                     (void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);

            }

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

            3.控制處理程序函數(shù)

             

             

            3.控制處理程序函數(shù)

            函數(shù) Service_Ctrl 是服務(wù)的控制處理程序函數(shù),由主函數(shù)線程的控制分發(fā)程序引用。在處理控制請求碼時,應(yīng)該在確定的時間間隔內(nèi)更新服務(wù)狀態(tài)檢查點(diǎn),避免發(fā)生服務(wù)不能響應(yīng)的錯誤。

             

             

            //控制處理程序函數(shù)

            void WINAPI Service_Ctrl(DWORD dwCtrlCode)

            {

                 //處理控制請求碼

                 switch(dwCtrlCode)

                 {

                     //先更新服務(wù)狀態(tài)為 SERVICDE_STOP_PENDING,再停止服務(wù)。

                 case SERVICE_CONTROL_STOP:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServiceStop();     //由具體的服務(wù)程序?qū)崿F(xiàn)

                     return;

                     //暫停服務(wù)

                 case SERVICE_CONTROL_PAUSE:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServicePause();    //由具體的服務(wù)程序?qū)崿F(xiàn)

                     ssStatus.dwCurrentState=SERVICE_PAUSED;

                     return;

                     //繼續(xù)服務(wù)

                 case SERVICE_CONTROL_CONTINUE:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServiceContinue(); //由具體的服務(wù)程序?qū)崿F(xiàn)

                     ssStatus.dwCurrentState=SERVICE_RUNNING;

                     return;

                     //更新服務(wù)狀態(tài)

                 case SERVICE_CONTROL_INTERROGATE:

                     break;

                     //無效控制碼

                 default:

                     break;

                 }

                 ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);

            }

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

              

             

            除了系統(tǒng)定義的五種控制碼外(還有一種是:SERVICE_CONTROL_SHUTDOWN),用戶還可自定義控制碼,其取值范圍是128-255。用戶可以通過控制面板中的服務(wù)項(xiàng)向特定服務(wù)程序的控制處理函數(shù)發(fā)送控制碼,程序員可以調(diào)用系統(tǒng)函數(shù) ControlService 直接向服務(wù)程序的控制處理函數(shù)發(fā)送控制碼。其函數(shù)原型如下:

             

            BOOL ControlService(

              SC_HANDLE hService,

              DWORD dwControl,

              LPSERVICE_STATUS lpServiceStatus

            );

            hService :函數(shù) OpenService or CreateService 返回的服務(wù)程序句柄。

            dwControl :控制碼,不能是SERVICE_CONTROL_SHUTDOWN。

            lpServiceStatus:返回最后收到的服務(wù)狀態(tài)信息。


            posted on 2011-06-17 14:37 厚積薄發(fā) 閱讀(268) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            国产69精品久久久久观看软件| 亚洲国产精品无码久久久秋霞2 | 9久久9久久精品| 精品午夜久久福利大片| 欧美伊香蕉久久综合类网站| 99久久婷婷国产一区二区| 精品熟女少妇aⅴ免费久久| 亚洲国产天堂久久久久久| 亚洲人成网亚洲欧洲无码久久 | 99久久人人爽亚洲精品美女| 欧美亚洲日本久久精品| 一本色道久久99一综合| 成人a毛片久久免费播放| 久久99热这里只有精品国产| 亚洲乱亚洲乱淫久久| 久久精品一本到99热免费| 久久久久免费精品国产| 午夜人妻久久久久久久久| 成人国内精品久久久久影院VR| 热re99久久6国产精品免费| 国产一区二区三精品久久久无广告| 久久精品久久久久观看99水蜜桃 | 精品久久久噜噜噜久久久| 日本久久中文字幕| 日本福利片国产午夜久久| 欧美大香线蕉线伊人久久| 亚洲欧美久久久久9999| 国产成人精品久久亚洲| 午夜精品久久久久久久| 一本色道久久88综合日韩精品 | 久久免费小视频| 久久久老熟女一区二区三区| 久久国产亚洲精品| 婷婷久久综合| 亚洲人成无码www久久久| 久久综合伊人77777麻豆| 国产精品日韩深夜福利久久| 99麻豆久久久国产精品免费| 国内精品伊人久久久久av一坑 | 精品999久久久久久中文字幕| 蜜臀久久99精品久久久久久小说|