WindowsNT/2000/XP系统服务程序开发模版

关键字: vc   系统服务   开发 程序


 

//以下程序为Win32控制台项目中编写。

//一、要添加的头文件

#include "winsvc.h"


//二、全局变量、全局函数定义

//服务全局变量
SERVICE_STATUS_HANDLE ssh;
SC_HANDLE scm,svc;
SERVICE_STATUS ss;
SERVICE_FAILURE_ACTIONS sfa;
CString m_sServiceName="在此输入你的服务名称";
CString m_sServiceDisplayName="在此输入你的服务显示名称";
CString m_sServiceDescription="在此输入你的服务描述";

//服务全局函数定义
void WINAPI ServiceMain(DWORD dwArgc, LPTSTR *lpszArgv);
void WINAPI ServiceCtrl(DWORD Opcode);
void InstallService();
void RemoveService();

// 要编写的系统服务入口函数
UINT MyServerMain(LPVOID lpvoid);

//三、_tmain函数

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 int nRetCode = 0;

 // 初始化 MFC 并在失败时显示错误
 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
 {
  // TODO: 更改错误代码以符合您的需要
  _tprintf(_T("致命错误: MFC 初始化失败/n"));
  nRetCode = 1;
 }
 else
 {
  // TODO: 在此处为应用程序的行为编写代码。
  SERVICE_TABLE_ENTRY ste[2];
  ste[0].lpServiceName=m_sServiceName;
  ste[0].lpServiceProc=ServiceMain;
  ste[1].lpServiceName=NULL;
  ste[1].lpServiceProc=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)
   {
    MyServerMain(NULL);
   }
   else
   {
    //如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
    //StartServiceCtrlDispatcher 函数。
    printf(" -install to install the service /n");
    printf(" -remove to remove the service /n");
    printf(" -debug to debug the service /n");
    printf("/n StartServiceCtrlDispatcher being called./n");
    printf("This may take several seconds.Please wait./n");
    if(!StartServiceCtrlDispatcher(ste))
     printf(TEXT("StartServiceCtrlDispatcher failed."));
    else
     printf(TEXT("StartServiceCtrlDispatcher OK."));
   }
  }
  else
  {
   如果未能和上面的如何参数匹配,则可能是服务控制管理程序来启动该程序。立即调用
   StartServiceCtrlDispatcher 函数。
   printf(" -install to install the service /n");
   printf(" -remove to remove the service /n");
   printf(" -debug to debug the service /n");
   printf("/n StartServiceCtrlDispatcher being called./n");
   printf("This may take several seconds.Please wait./n");
   if(!StartServiceCtrlDispatcher(ste))
    printf(TEXT("StartServiceCtrlDispatcher failed."));
   else
    printf(TEXT("StartServiceCtrlDispatcher OK."));

   //测试
   //MyServerMain(NULL);
  }
 }

 return nRetCode;
}


//四、系统服务函数

void InstallService()
{
 LPTSTR lpSysPath=new char[MAX_PATH];
 GetSystemDirectory(lpSysPath,MAX_PATH);
 LPCTSTR lpsysfilename;
 SERVICE_DESCRIPTION SvrDes;
 SvrDes.lpDescription=m_sServiceDescription.GetBuffer();

 CString RunPath;
 ::GetModuleFileName(::AfxGetInstanceHandle(), RunPath.GetBuffer(1024), 1024);
 lpsysfilename=RunPath;
 scm=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
 if(scm!=NULL)
 {
  svc=CreateService(scm,m_sServiceName,m_sServiceDisplayName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS,SERVICE_AUTO_START,SERVICE_ERROR_IGNORE,lpsysfilename,NULL,NULL,NULL,NULL,NULL);
  Sleep(1000);
  ChangeServiceConfig2(svc,SERVICE_CONFIG_DESCRIPTION,&SvrDes);
  SC_ACTION ssa[1];
  ssa[0].Delay=5000;    //服务失败5000毫秒后执行失败操作
  ssa[0].Type=SC_ACTION_RESTART; //失败后重新启动服务
  sfa.dwResetPeriod=0;   //0秒后重置失败计数
  sfa.lpCommand=NULL;
  sfa.lpRebootMsg=NULL;
  sfa.cActions=1;
  sfa.lpsaActions=ssa;
  ChangeServiceConfig2(svc,SERVICE_CONFIG_FAILURE_ACTIONS,&sfa);
  Sleep(1000);
 }
 if(svc!=NULL)
 {
  svc=OpenService(scm,m_sServiceName,SERVICE_START);
 }
 if(svc!=NULL)
 {
  StartService(svc,0,NULL);
  CloseServiceHandle(svc);
 }
 CloseServiceHandle(scm);
 delete lpSysPath;
}

void WINAPI ServiceMain(DWORD dwArgc,LPTSTR *lpszArgv)
{
 ss.dwServiceType=SERVICE_WIN32;
 ss.dwCurrentState=SERVICE_START_PENDING;
 ss.dwControlsAccepted=SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
 ss.dwServiceSpecificExitCode=0;
 ss.dwWin32ExitCode=0;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 ssh=RegisterServiceCtrlHandler(m_sServiceName,ServiceCtrl);
 ss.dwCurrentState=SERVICE_RUNNING;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 SetServiceStatus(ssh,&ss);
 AfxBeginThread(MyServerMain,NULL,NULL);
 ss.dwCurrentState=SERVICE_RUNNING;
 ss.dwCheckPoint=0;
 ss.dwWaitHint=0;
 SetServiceStatus(ssh,&ss);
}

void WINAPI ServiceCtrl(DWORD Opcode)
{
 switch(Opcode)
 {
 case SERVICE_CONTROL_STOP:
  ss.dwCurrentState=SERVICE_STOPPED;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_CONTINUE:
  ss.dwCurrentState=SERVICE_RUNNING;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_PAUSE:
  ss.dwCurrentState=SERVICE_PAUSED;
  SetServiceStatus(ssh,&ss);
  break;
 case SERVICE_CONTROL_INTERROGATE:
  break;
 }
 SetServiceStatus(ssh,&ss);
}

void RemoveService()
{
 SC_HANDLE schService;
 SC_HANDLE schSCManager;
 SERVICE_STATUS ssStatus;
 //打开服务管理数据库
 schSCManager=OpenSCManager(
  NULL,    //本地计算机
  NULL,    //默认的数据库
  SC_MANAGER_ALL_ACCESS  //要求所有的访问权
  );
 if(schSCManager)
 {
  //获取服务程序句柄
  schService=OpenService(
   schSCManager,   //服务管理数据库句柄
   m_sServiceName,  //服务名
   SERVICE_ALL_ACCESS //响应所有的访问请求
   );
  if(schService)
  {
   //试图停止服务
   if(ControlService(
    schService,    //服务程序句柄
    SERVICE_CONTROL_STOP, //停止服务请求码
    &ssStatus    //接收最后的服务状态信息
    ))
   {
    _tprintf(TEXT("Stopping %s."),m_sServiceName);
    Sleep(1000);
    //等待服务停止
    //
    while(QueryServiceStatus(schService,&ssStatus))
    {
     if(SERVICE_STOP_PENDING==ssStatus.dwCurrentState)
     {
      _tprintf(TEXT("."));
      Sleep(1000);
     }
     else
      break;
    }
    if(SERVICE_STOPPED==ssStatus.dwCurrentState)
     _tprintf(TEXT("/n%s stopped. /n"),m_sServiceName);
    else
     _tprintf(TEXT("/n%s failed to stopp. /n"),m_sServiceName);
   }
   //删除已安装的服务程序安装
   if(DeleteService(schService))
    _tprintf(TEXT("%s removed. /n"),m_sServiceName);
   else
    _tprintf(TEXT("DeleteService failed - %s. /n"), GetLastError());
   CloseServiceHandle(schService);
  }
  else
   _tprintf(TEXT("OpenService failed - %s /n"),GetLastError());
  CloseServiceHandle(schSCManager);
 }
 else
  _tprintf(TEXT("OpenSCManager failed - %s /n"),GetLastError());
}


//五、你自己的功能函数入口

UINT MyServerMain(LPVOID lpvoid)
{
 return 0;
}
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值