&;status); status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &;status); //模拟服务的运行,10 后自动退出。应用时将主要任务放于此即可 int i = 0; while (i < 10) { Sleep(1000); i++; } // status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &;status); LogEvent(_T("Service stopped")); } 六、在主线程函数里注册控制函数和程序执行主体。这里主要是说明这就 是程序的执行体。 void WINAPI ServiceMain() { … //模拟服务的运行,10 后自动退出。应用时将主要任务放于此即可 int i = 0; while (i < 10)
{ Sleep(1000); i++; } … } 七、最后,要在 main 函数里注册添加安装、删除、
注册主函数。 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR int { 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!")); } } lpCmdLine, nCmdShow)
return 0; } 八、总结。其实做一个服务程序并不难,主要是懂得程序的执行体放于哪 里?和注册程序的主函数和注册控制函数,如果这两个没有注册的话,你 就 程 序 就 不 知 道 如 何 去 控 制 了 。 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;这个也重要,如果你没有设置的话,那么服务就 不会受你控制了。