轉(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)信息。