五,、添加服務(wù)主線程函數(shù)和控制函數(shù)
這里調(diào)用RegisterServiceCtrlHandler來注冊服務(wù)的控制函數(shù),這里要設(shè)置status.dwControlsAccepted為SERVICE_ACCEPT_STOP,,否則你不能控制這個服務(wù)的狀態(tài),。
void WINAPI ServiceMain() { // Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//這個要使用,否則你不能控制
//注冊服務(wù)控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl); if (hServiceStatus == NULL) { LogEvent(_T("Handler not installed")); return; } SetServiceStatus(hServiceStatus, &status); status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &status);
//模擬服務(wù)的運行,,10后自動退出。應(yīng)用時將主要任務(wù)放于此即可
int i = 0; while (i < 10) { Sleep(1000); i++; } //
status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); LogEvent(_T("Service stopped")); } |
六,、在主線程函數(shù)里注冊控制函數(shù)和程序執(zhí)行主體
void WINAPI ServiceMain() { …
//如上,,這里主要是說明這就是程序的執(zhí)行體 //模擬服務(wù)的運行,10后自動退出,。應(yīng)用時將主要任務(wù)放于此即可
int i = 0; while (i < 10) { Sleep(1000); i++; } … } |
七,、在main函數(shù)里注冊添加安裝、刪除,、注冊主函數(shù)
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,
int nCmdShow) { Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } };
if (stricmp(lpCmdLine, "/install") == 0) { Install(); } else if (stricmp(lpCmdLine, "/uninstall") == 0) { Uninstall(); } else { if (!::StartServiceCtrlDispatcher(st)) { LogEvent(_T("Register Service Main Function Error!")); } } return 0; } |
八,、總結(jié) 其它做一個服務(wù)程序并難,主要是懂得程序的執(zhí)行體放于哪里,?和注冊程序的主函數(shù)和注冊控制函數(shù),,如果這兩個沒有注冊的話,你就程序就不知道如何去控制了,。status.dwControlsAccepted = SERVICE_ACCEPT_STOP;這個也重要,,如果你沒有設(shè)置的話,那么服務(wù)就不會受你控制了,。
|