c 建立windows services程序

// SqlServices.cpp : WinMain 的实现
#define SLEEP_TIME 1000  
SERVICE_STATUS ServiceStatus; // 服务状态
SERVICE_STATUS_HANDLE hStatus; // 服务状态句柄
  1. 服务初始化

// 服务初始化 
int InitService() 
{ 
 int result;  
  
  return(result); 
}

2.main函数创建分派表并启动控制分派机

//mai0n函数创建分派表并启动控制分派机
void main() 
{ 
 TCHAR serviceName[] = _T("GWAMService");
 SERVICE_TABLE_ENTRY ServiceTable[2];  
 ServiceTable[0].lpServiceName = serviceName; //指向表示服务名称字符串的指针(只有一个服务时服务名定义是可选的)
 ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain; //指向服务主函数的指针(服务入口点) //分派表的最后一项必须是服务名和服务主函数域的 NULL 指针
 ServiceTable[1].lpServiceName = NULL; 
 ServiceTable[1].lpServiceProc = NULL;  // 启动服务的控制分派机线程 
 StartServiceCtrlDispatcher(ServiceTable);  
}

3.ServiceMain 的代码该函数是服务的入口点

void ServiceMain(int argc, char** argv) 
{
 BOOL bRet;
 bRet = TRUE;  
 ServiceStatus.dwServiceType = SERVICE_WIN32; //设置服务的类型
 ServiceStatus.dwCurrentState = SERVICE_START_PENDING; //设置服务当前的状态,服务将要开启
 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;//设置服务可接受的控制,服务不能被结束,当系统关闭时服务会收到通知
 ServiceStatus.dwWin32ExitCode = 0; //指定win32服务的错误代码
 ServiceStatus.dwServiceSpecificExitCode = 0;// 指定一个服务特定错误代码
 ServiceStatus.dwCheckPoint = 0;//用于跟踪服务,必须由服务周期性的增加,否则scm会在dwWaitHint去超时时报错
 ServiceStatus.dwWaitHint = 0; //超时值
 hStatus = RegisterServiceCtrlHandler(_T("SERVICENAME"), (LPHANDLER_FUNCTION)ControlHandler); 
 if (hStatus == (SERVICE_STATUS_HANDLE)0) 
 {
  //登陆失败
  return;
 } // service状态情报更新
 ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
 SetServiceStatus (hStatus, &ServiceStatus);//设置服务运行状态 
 while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)//当服务正在运行时
 {
  
  //GWEW007_FUNC01();//获取天气预报
  StartFunc();//处理函数  
  
   //ServiceStatus.dwCurrentState == SERVICE_CONTROL_STOP;

  
  Sleep(SLEEP_TIME);

   }
 return;
}

4.处理控制请求

void ControlHandler(DWORD request) 
{ 
 switch(request) 
 { 
 case SERVICE_CONTROL_STOP: 
  ServiceStatus.dwWin32ExitCode = 0; 
  ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
  SetServiceStatus (hStatus, &ServiceStatus);
  return;  case SERVICE_CONTROL_SHUTDOWN: 
  GWAM001_FUNC01("Monitoring stopped."); 
  ServiceStatus.dwWin32ExitCode = 0; 
  ServiceStatus.dwCurrentState = SERVICE_STOPPED; 
  SetServiceStatus (hStatus, &ServiceStatus);
  return;  
 default:
  break;
 }  SetServiceStatus (hStatus, &ServiceStatus); 
 return; 
}

转载于:https://my.oschina.net/qihaitao/blog/395014

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值