windows后台服务程序范例


//服务程序主函数。
#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 ;
}
 

 




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值