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

            后臺服務程序開發模式(二)

            轉自http://www.7880.com/Info/Article-5a903440.html

            2.服務入口點函數

             

            服務入口點函數 service_main 首先調用系統函數 RegisterServiceCtrlHandler 注冊服務控制處理函數 service_ctrl,然后調用 ReportStatusToSCMgr 函數,它通過系統函數 SetServiceStatus 更新服務的狀態,然后調用特定的服務初始化入口函數 ServiceStart 完成具體的初始化工作。

             

             

            //服務入口點函數

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

            {

                 //注冊服務控制處理函數

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

                 //如果注冊失敗

                 if(!sshStatusHandle)

                 {

                     goto cleanup;

                     return;

                 }

                 //初始化 SERVICE_STATUS 結構中的成員

                 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;

                 ssStatus.dwServiceSpecificExitCode=0;

                 //更新服務狀態

                 if(!ReportStatusToSCMgr(

                     SERVICE_START_PENDING,//服務狀態,The service is starting.

                     NO_ERROR,            //退出碼        

                     3000))                   //等待時間

                     goto cleanup;        //更新服務狀態失敗則轉向 cleanup

                 ServiceStart(dwArgc,lpszArgv);

                 return;

            cleanup:

                 //把服務狀態更新為 SERVICE_STOPPED,并退出。

                 if(sshStatusHandle)

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

            }

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

            3.控制處理程序函數

             

             

            3.控制處理程序函數

            函數 Service_Ctrl 是服務的控制處理程序函數,由主函數線程的控制分發程序引用。在處理控制請求碼時,應該在確定的時間間隔內更新服務狀態檢查點,避免發生服務不能響應的錯誤。

             

             

            //控制處理程序函數

            void WINAPI Service_Ctrl(DWORD dwCtrlCode)

            {

                 //處理控制請求碼

                 switch(dwCtrlCode)

                 {

                     //先更新服務狀態為 SERVICDE_STOP_PENDING,再停止服務。

                 case SERVICE_CONTROL_STOP:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServiceStop();     //由具體的服務程序實現

                     return;

                     //暫停服務

                 case SERVICE_CONTROL_PAUSE:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServicePause();    //由具體的服務程序實現

                     ssStatus.dwCurrentState=SERVICE_PAUSED;

                     return;

                     //繼續服務

                 case SERVICE_CONTROL_CONTINUE:

                     ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

                     ServiceContinue(); //由具體的服務程序實現

                     ssStatus.dwCurrentState=SERVICE_RUNNING;

                     return;

                     //更新服務狀態

                 case SERVICE_CONTROL_INTERROGATE:

                     break;

                     //無效控制碼

                 default:

                     break;

                 }

                 ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);

            }

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

             

              

             

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

             

            BOOL ControlService(

              SC_HANDLE hService,

              DWORD dwControl,

              LPSERVICE_STATUS lpServiceStatus

            );

            hService :函數 OpenService or CreateService 返回的服務程序句柄。

            dwControl :控制碼,不能是SERVICE_CONTROL_SHUTDOWN。

            lpServiceStatus:返回最后收到的服務狀態信息。


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

            導航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            日韩乱码人妻无码中文字幕久久 | 久久午夜免费视频| 国产午夜电影久久| 精品伊人久久久| 99久久精品国产一区二区| 97精品伊人久久大香线蕉| 国产精品岛国久久久久| 久久久久综合中文字幕| 国内精品久久久久影院日本| 麻豆久久| 久久se精品一区二区影院 | 久久精品桃花综合| 久久伊人精品青青草原高清| 精品久久久中文字幕人妻 | 久久久久高潮毛片免费全部播放| 久久亚洲精品中文字幕| 久久精品国产69国产精品亚洲| 久久久久一区二区三区| 久久婷婷五月综合97色| 大香伊人久久精品一区二区| 久久香蕉国产线看观看99| 色偷偷久久一区二区三区| 亚洲性久久久影院| 久久久久99精品成人片牛牛影视| 久久综合综合久久97色| 91久久精一区二区三区大全| 青青草原精品99久久精品66| 欧美激情精品久久久久久| 久久精品国产亚洲5555| 精品无码久久久久久国产| 99久久国产综合精品麻豆| 久久精品亚洲中文字幕无码麻豆| 久久无码AV中文出轨人妻| 久久夜色精品国产噜噜亚洲a| 久久乐国产综合亚洲精品| 97视频久久久| 国产精品免费看久久久| 一本久久久久久久| 无码任你躁久久久久久| 伊人久久精品无码av一区| 久久er99热精品一区二区|