windows后台服务程序范例

来源:互联网 发布:公司大数据 编辑:程序博客网 时间:2024/06/05 03:13


//服务程序主函数。#include <stdio.h>//#include "stdafx.h"#include <Windows.h>#include <iostream>#define SZAPPNAME      "serverSample"     //服务程序名#define SZSERVICENAME  "serviceSample"    //标识服务的内部名//内部变量bool                   bDebugServer=false;SERVICE_STATUS              ssStatus;SERVICE_STATUS_HANDLE  sshStatusHandle;DWORD                       dwErr=0;TCHAR                       szErr[256];//下面的函数由程序实现void  WINAPI  Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);void  WINAPI  Service_Ctrl(DWORD dwCtrlCode);void installService();void removeService();void debugService(int argc,char** argv);bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);void AddToMessageLog(LPTSTR lpszMsg);void ServiceStop() ;void ServicePause() ;void ServiceContinue();int main(int argc, char* argv[]){     SERVICE_TABLE_ENTRY dispatchTable[]= {  {TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},  { NULL,NULL} }; if((argc>1)&&((*argv[1]=='-')||(argv[1]=="/"))) {  if(_stricmp("install",argv[1]+1)==0)  {   installService();  }  else if(_stricmp("remove",argv[1]+1)==0)  {   removeService();  }  else if(_stricmp("debug",argv[1]+1)==0)  {   bDebugServer=true;   debugService(argc,argv);  }  else  {        //如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用   //StartServiceCtrlDispatcher 函数。   printf("%s - install to install the service /n",SZAPPNAME);   printf("%s - remove to remove the service /n",SZAPPNAME);   printf("%s - debug to debug the service /n",SZAPPNAME);   printf("/n StartServiceCtrlDispatcher being called./n");   printf("This may take several seconds.Please wait./n");   if(!StartServiceCtrlDispatcher(dispatchTable))    AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));   else    AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK."));  }  exit(0); } return 0;}//服务入口点函数void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具体服务的初始化入口函数void  WINAPI  Service_Main(DWORD dwArgc, LPTSTR *lpszArgv){ //注册服务控制处理函数 sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl); //如果注册失败 if(!sshStatusHandle) {  goto cleanup;  return; } //初始化 SERVICE_STATUS 结构中的成员 ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; ssStatus.dwServiceSpecificExitCode=0; //更新服务状态 if(!ReportStatusToSCMgr(  SERVICE_START_PENDING,//服务状态,The service is starting.  NO_ERROR,            //退出码          3000))                   //等待时间  goto cleanup;        //更新服务状态失败则转向 cleanup ServiceStart(dwArgc,lpszArgv); return;cleanup: //把服务状态更新为 SERVICE_STOPPED,并退出。 if(sshStatusHandle)  (void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);}void WINAPI Service_Ctrl(DWORD dwCtrlCode){ //处理控制请求码 switch(dwCtrlCode) {  //先更新服务状态为 SERVICDE_STOP_PENDING,再停止服务。 case SERVICE_CONTROL_STOP:  ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);  ServiceStop();     //由具体的服务程序实现  return;  //暂停服务 case SERVICE_CONTROL_PAUSE:  ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);  ServicePause();    //由具体的服务程序实现  ssStatus.dwCurrentState=SERVICE_PAUSED;  return;  //继续服务 case SERVICE_CONTROL_CONTINUE:  ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);  ServiceContinue(); //由具体的服务程序实现  ssStatus.dwCurrentState=SERVICE_RUNNING;  return;  //更新服务状态 case SERVICE_CONTROL_INTERROGATE:  break;  //无效控制码 default:  break; } ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);}//安装服务程序void installService(){ SC_HANDLE schService; SC_HANDLE schSCManager; TCHAR szPath[512]; //得到程序磁盘文件的路径 //A handle to the loaded module whose path is being requested. If this parameter is NULL,  //GetModuleFileName retrieves the path of the executable file of the current process. if(GetModuleFileName(NULL,szPath,512)==0) {/*  _tprintf(TEXT("Unable to install %s - %s /n"),   TEXT(SZAPPNAME),   GetLastError());//@1获取调用函数返回的最后错误码*/  printf("Unable to install %s - %s /n" , SZAPPNAME, GetLastError()) ;  return; } //打开服务管理数据库 schSCManager=OpenSCManager(  NULL,    //如果为NULL,则指本地计算机  NULL,    //默认的数据库  SC_MANAGER_ALL_ACCESS  //要求所有的访问权  ); if(schSCManager) {  //登记服务程序  schService=CreateService(   schSCManager,                    //服务管理数据库句柄   TEXT(SZSERVICENAME),             //服务名   TEXT(SZAPPNAME),       //用于显示服务的标识   SERVICE_ALL_ACCESS,              //响应所有的访问请求   SERVICE_WIN32_OWN_PROCESS,       //服务类型   SERVICE_DEMAND_START,            //启动类型   SERVICE_ERROR_NORMAL,            //错误控制类型   szPath,                              //服务程序磁盘文件的路径   NULL,                                //服务不属于任何组   NULL,                                //没有tag标识符   NULL,              //启动服务所依赖的服务或服务组,这里仅仅是一个空字符串   NULL,                                //LocalSystem 帐号   NULL);  if(schService)  { /*  _tprintf(TEXT("%s installed. /n"),TEXT(SZAPPNAME));*/   printf("the service created!\n") ;   printf("%s installed. /n", SZAPPNAME) ;   CloseServiceHandle(schService);  }  else  {  /* _tprintf(TEXT("CreateService failed - %s /n"),GetLastError());*/   printf("CreateService failed - %s /n" , GetLastError()) ;  }  CloseServiceHandle(schSCManager); } else  printf("OpenSCManager failed - %s /n", GetLastError()) ;  //_tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}//停止和删除已安装的服务程序void removeService(){ SC_HANDLE schService; SC_HANDLE schSCManager; //打开服务管理数据库 schSCManager=OpenSCManager(  NULL,    //本地计算机  NULL,    //默认的数据库  SC_MANAGER_ALL_ACCESS  //要求所有的访问权  ); if(schSCManager) {  //获取服务程序句柄  schService=OpenService(   schSCManager,          //服务管理数据库句柄   TEXT(SZSERVICENAME),   //服务名   SERVICE_ALL_ACCESS     //响应所有的访问请求   );  if(schService)  {   //试图停止服务 send a control code to the service ;   if(ControlService(    schService,                 //服务程序句柄(从上面打开服务获得的)    SERVICE_CONTROL_STOP,  //停止服务请求码    &ssStatus              //接收最后的服务状态信息    ))   {   /* _tprintf(TEXT("Stopping %s."),TEXT(SZAPPNAME));*/    printf("Stopping %s.", SZAPPNAME) ;    Sleep(1000);     //等待服务停止    //    while(QueryServiceStatus(schService,&ssStatus))    {     if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState)     {     // _tprintf(TEXT("."));      printf(".") ;      Sleep(1000);     }     else      break;    }    if(SERVICE_STOPPED==ssStatus.dwCurrentState)     printf("/n %s stopped. /n", SZAPPNAME) ;    // _tprintf(TEXT("/n %s stopped. /n"),TEXT(SZAPPNAME));    else     printf("/n %s failed to stopp. /n", SZAPPNAME);    // _tprintf(TEXT("/n %s failed to stopp. /n"),TEXT(SZAPPNAME));   }   //删除已安装的服务程序安装   if(DeleteService(schService))    printf("%s removed. /n",SZAPPNAME) ; //   _tprintf(TEXT("%s removed. /n"),TEXT(SZAPPNAME));   else  //  _tprintf(TEXT("DeleteService failed - %s. /n"), GetLastError());    printf("DeleteService failed - %s. /n", GetLastError()) ;   CloseServiceHandle(schService);  }  else   printf("OpenService failed - %s /n", GetLastError()) ;  // _tprintf(TEXT("OpenService failed - %s /n"),GetLastError());  CloseServiceHandle(schSCManager); } else  printf("OpenSCManager failed - %s /n" ,GetLastError()); // _tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());}void ServiceStop(){}void ServicePause(){}void ServiceContinue(){}void debugService(int argc,char** argv){ printf("debuging service ...\n") ;}void AddToMessageLog(LPTSTR lpszMsg){}//服务入口点函数void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)//具体服务的初始化入口函数{}bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint){ return true ;} 

 
http://www.vckbase.com/
http://www.vckbase.com/document/viewdoc/?id=1474
http://edu.gamfe.com/tutor/d/12405.html
http://blog.csdn.net/qpl007/article/details/143801
 http://www.cnblogs.com/lartely/archive/2011/04/10/2011770.html




原创粉丝点击