龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用 VC 建立 Windows 服务程序(2)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
//停止服务 ControlService(hService, SERVICE_CONTROL_STOP, status); //删除服务 DeleteService(hService); … } 五、添加服务主线程函数和控制函数。这里调用 RegisterServiceCtrl

//停止服务
ControlService(hService, SERVICE_CONTROL_STOP, &status);

//删除服务
DeleteService(hService);

  …
}
五、添加服务主线程函数和控制函数。这里调用 RegisterServiceCtrlHandler 来注册服务的控制函数,
这里要设置status.dwControlsAccepted 为 SERVICE_ACCEPT_STOP,否则你不能控制这个服务的状态。


void WINAPI ServiceMain()
{
  // Register the control request handler
  status.dwCurrentState = SERVICE_START_PENDING;
  status.dwControlsAccepted = SERVICE_ACCEPT_STOP;//这个要使用,否则你不能控制

  //注册服务控制
  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);

  //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
  int i = 0;
  while (i
       六、在主线程函数里注册控制函数和程序执行主体。这里主要是说明这就是程序的执行体。
void WINAPI ServiceMain()
{
  …

  //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
  int i = 0;
  while (i
七、最后,要在main函数里注册添加安装、删除、注册主函数。

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;
}

八、总结。其实做一个服务程序并不难,主要是懂得程序的执行体放于哪里?和注册程序的主函数和注册控制函数,如果这两个没有注册的话,你就程序就不知道如何去控制了。status.dwControlsAccepted = SERVICE_ACCEPT_STOP;这个也重要,如果你没有设置的话,那么服务就不会受你控制了。

精彩图集

赞助商链接