服务程序例子

 

#include   <stdio.h>  
  #include   <windows.h>  
  #include   <winbase.h>  
  #include   <winsvc.h>  
   
  const   int   nBufferSize   =   500;  
  char   pServiceName[nBufferSize+1];  
  char   pExeFile[nBufferSize+1];  
   
  SERVICE_STATUS                     serviceStatus;    
  SERVICE_STATUS_HANDLE       hServiceStatusHandle;    
   
  void   ReportError(LPCTSTR   s)  
  {  
  long   e   =   GetLastError();  
  char   buf[1024];  
  wsprintf(buf,   "%s   failed,   error   code   =   %d/n",s,   e);  
  OutputDebugString(buf);  
  }  
  void   ShowDebugMsg(LPCTSTR   s1,LPCTSTR   s2)  
  {  
  char   b[1024];  
  wsprintf(b,s1,s2);  
  OutputDebugString(b);  
  }  
  VOID   WINAPI   MyServiceHandler(DWORD   fdwControl)  
  {  
  switch(fdwControl)    
  {  
  case   SERVICE_CONTROL_STOP:  
  serviceStatus.dwWin32ExitCode   =   0;    
  serviceStatus.dwCurrentState     =   SERVICE_STOPPED;    
  serviceStatus.dwCheckPoint         =   0;    
  serviceStatus.dwWaitHint             =   0;  
  if   (!SetServiceStatus(hServiceStatusHandle,   &serviceStatus))  
  ReportError("SetServiceStatus");  
  else  
  OutputDebugString("Service_stop");  
  return;    
  case   SERVICE_CONTROL_PAUSE:  
  serviceStatus.dwCurrentState   =   SERVICE_PAUSED;    
  OutputDebugString("SERVICE_PAUSED");  
  break;  
  case   SERVICE_CONTROL_CONTINUE:  
  serviceStatus.dwCurrentState   =   SERVICE_RUNNING;    
  OutputDebugString("SERVICE_RUNNING");  
  break;  
  case   SERVICE_CONTROL_INTERROGATE:  
  break;  
  default:    
  break;  
  };  
          if   (!SetServiceStatus(hServiceStatusHandle,     &serviceStatus))    
  ReportError("SetServiceStatus");  
  }  
  VOID   WINAPI   MyServiceMain(   DWORD   dwArgc,   LPTSTR   *lpszArgv   )  
  {  
  DWORD       status   =   0;    
          DWORD       specificError   =   0xfffffff;    
          serviceStatus.dwServiceType                 =   SERVICE_WIN32;    
          serviceStatus.dwCurrentState               =   SERVICE_START_PENDING;    
          serviceStatus.dwControlsAccepted       =   SERVICE_ACCEPT_STOP   |   SERVICE_ACCEPT_PAUSE_CONTINUE;    
          serviceStatus.dwWin32ExitCode             =   0;    
          serviceStatus.dwServiceSpecificExitCode   =   0;    
          serviceStatus.dwCheckPoint                   =   0;    
          serviceStatus.dwWaitHint                       =   0;    
          hServiceStatusHandle   =   RegisterServiceCtrlHandler(pServiceName,   MyServiceHandler);    
          if   (hServiceStatusHandle==0)    
          {  
  ReportError("RegisterServiceCtrlHandler");  
                  return;    
          }    
          //   Handle   error   condition    
  status   =   GetLastError();    
          if   (status!=NO_ERROR)    
  {    
                  serviceStatus.dwCurrentState               =   SERVICE_STOPPED;    
                  serviceStatus.dwCheckPoint                   =   0;    
                  serviceStatus.dwWaitHint                       =   0;    
                  serviceStatus.dwWin32ExitCode             =   status;    
                  serviceStatus.dwServiceSpecificExitCode   =   specificError;    
                  SetServiceStatus(hServiceStatusHandle,   &serviceStatus);    
                  return;    
          }    
          //   Initialization   complete   -   report   running   status    
          serviceStatus.dwCurrentState               =   SERVICE_RUNNING;    
          serviceStatus.dwCheckPoint                   =   0;    
          serviceStatus.dwWaitHint                       =   0;      
          if(!SetServiceStatus(hServiceStatusHandle,   &serviceStatus))    
          {    
  ReportError("SetServiceStatus");  
          }    
   
  }  
  SERVICE_TABLE_ENTRY       DispatchTable[]   =    
  {    
  {pServiceName,   MyServiceMain},    
  {NULL,   NULL}  
  };  
  BOOL   KillService(char*   pName)    
  {    
  SC_HANDLE   schSCManager   =   OpenSCManager(   NULL,   NULL,   SC_MANAGER_ALL_ACCESS);    
  if   (schSCManager==0)    
  ReportError("OpenSCManager");  
  else  
  {  
  SC_HANDLE   schService   =   OpenService(   schSCManager,   pName,   SERVICE_ALL_ACCESS);  
  if   (schService==0)    
  ReportError("OpenService");  
  else  
  {  
  SERVICE_STATUS   status;  
  if(ControlService(schService,SERVICE_CONTROL_STOP,&status))  
  {  
  CloseServiceHandle(schService);    
  CloseServiceHandle(schSCManager);    
  return   TRUE;  
  }  
  else  
  ReportError("ControlService");  
  CloseServiceHandle(schService);    
  }  
  CloseServiceHandle(schSCManager);    
  }  
  return   FALSE;  
  }  
   
  BOOL   RunService(char*   pName,   int   nArg,   char**   pArg)    
  {    
  SC_HANDLE   schSCManager   =   OpenSCManager(   NULL,   NULL,   SC_MANAGER_ALL_ACCESS);    
  if   (schSCManager==0)    
  ReportError("OpenSCManager");  
  else  
  {  
  SC_HANDLE   schService   =   OpenService(   schSCManager,   pName,   SERVICE_ALL_ACCESS);  
  if   (schService==0)    
  ReportError("OpenService");  
  else  
  {  
  if(StartService(schService,nArg,(const   char**)pArg))  
  {  
  CloseServiceHandle(schService);    
  CloseServiceHandle(schSCManager);    
  return   TRUE;  
  }  
  else  
  ReportError("StartService");  
  CloseServiceHandle(schService);    
  }  
  CloseServiceHandle(schSCManager);    
  }  
  return   FALSE;  
  }  
   
  VOID   UnInstall(char*   pName)  
  {  
  SC_HANDLE   schSCManager   =   OpenSCManager(   NULL,   NULL,   SC_MANAGER_ALL_ACCESS);    
  if   (schSCManager==0)    
  ReportError("OpenSCManager");  
  else  
  {  
  SC_HANDLE   schService   =   OpenService(   schSCManager,   pName,   SERVICE_ALL_ACCESS);  
  if   (schService==0)    
  ReportError("OpenService");  
  else  
  {  
  char   pLog2[1024];  
  if(!DeleteService(schService))    
  wsprintf(pLog2,   "Failed   to   delete   service   %s/n",   pName);    
  else    
  wsprintf(pLog2,   "Service   %s   removed/n",pName);    
  OutputDebugString(pLog2);  
   
  CloseServiceHandle(schService);    
  }  
  CloseServiceHandle(schSCManager);  
  }  
  }  
  VOID   Install(char*   pPath,   char*   pName)    
  {      
  SC_HANDLE   schSCManager   =   OpenSCManager(   NULL,   NULL,   SC_MANAGER_CREATE_SERVICE);    
  if   (schSCManager==0)    
  ReportError("OpenSCManager");  
  else  
  {  
  SC_HANDLE   schService   =   CreateService  
  (    
  schSCManager, /*   SCManager   database             */    
  pName, /*   name   of   service                   */    
  pName, /*   service   name   to   display   */    
  SERVICE_ALL_ACCESS,                 /*   desired   access                     */    
  SERVICE_WIN32_OWN_PROCESS|SERVICE_INTERACTIVE_PROCESS   ,   /*   service   type                         */    
  SERVICE_AUTO_START,             /*   start   type                             */    
  SERVICE_ERROR_NORMAL,             /*   error   control   type             */    
  pPath, /*   service's   binary                 */    
  NULL,                                             /*   no   load   ordering   group     */    
  NULL,                                             /*   no   tag   identifier               */    
  NULL,                                             /*   no   dependencies                   */    
  NULL,                                             /*   LocalSystem   account           */    
  NULL  
  );                                           /*   no   password                           */    
  if   (schService==0)    
  {  
  char   buf[1024];  
  wsprintf(buf,   "Failed   to   create   service   %s/n",   pName);    
  OutputDebugString(buf);  
  }  
  else  
  {  
  ShowDebugMsg("Service   %s   installed/n",   pName);  
  CloseServiceHandle(schService);    
  }  
  CloseServiceHandle(schSCManager);  
  }  
  }  
  Top

2 楼masterz(www.fruitfruit.com)回复于 2003-04-19 19:35:01 得分 30

//continue...  
   
   
  void   main(int   argc,   char   *argv[]   )  
  {  
  char   pModuleFile[nBufferSize+1];  
  DWORD   dwSize   =   GetModuleFileName(NULL,pModuleFile,nBufferSize);  
  pModuleFile[dwSize]   =   0;  
  if(dwSize>4&&pModuleFile[dwSize-4]=='.')  
  {  
  sprintf(pExeFile,"%s",pModuleFile);  
  pModuleFile[dwSize-4]   =   0;  
  }  
  else  
  sprintf(pExeFile,"%s",argv[0]);  
  char   drive[_MAX_DRIVE];  
  char   dir[_MAX_DIR];  
  char   ext[_MAX_EXT];  
  _splitpath(pExeFile,drive,dir,pServiceName,ext) ;  
   
  if(argc==2&&_stricmp("-u",argv[1])==0)  
  UnInstall(pServiceName);  
  else   if(argc==2&&_stricmp("-i",argv[1])==0)  
  Install(pExeFile,   pServiceName);  
  else   if(argc==2&&_stricmp("-b",argv[1])==0)  
  {  
  KillService(pServiceName);  
  RunService(pServiceName,0,NULL);  
  }  
  else   if(argc==3&&_stricmp("-k",argv[1])==0)  
  {  
  if(KillService(argv[2]))  
  ShowDebugMsg("Killed   service   %s./n",   argv[2]);  
  else  
  ShowDebugMsg("Failed   to   kill   service   %s./n",   argv[2]);    
  }  
  else   if(argc>=3&&_stricmp("-r",argv[1])==0)  
  {  
  if(RunService(argv[2],   argc>3?(argc-3):0,argc>3?(&(argv[3])):NULL))  
  ShowDebugMsg("Ran   service   %s./n",   argv[2]);  
  else  
  OutputDebugString("failed   to   run   myservice");  
  }  
  else    
  if(!StartServiceCtrlDispatcher(DispatchTable))  
  ReportError("StartServiceCtrlDispatcher");  
  }  
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值