轉自
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:返回最后收到的服務狀態信息。