WIN32编程--用Windows API实现Windows NT服务的程序框架

#include <windows.h> 
#include <stdio.h> 

//变量声明 
char ServiceName[]="NTService"; 
SERVICE_STATUS ssStatus; 
SERVICE_STATUS_HANDLE ServiceStatusHandle; 

//前向声明 
void ShowHelp(); 
void InsallService(); 
void RemoveService(); 
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR* lpszArgv); 
void WINAPI ControlHandler(DWORD dwCtrlCode); 

//主程序入口 
int main(int argc,char** argv) 
{ 
 //未带参数 
 if(argc==1) 
 { 
  SERVICE_TABLE_ENTRY ServiceTableEntry[]={{ServiceName,ServiceMain},{NULL,NULL}}; 
  if(!StartServiceCtrlDispatcher(ServiceTableEntry)) 
  { 
   printf("StartServiceCtrlDispatcher failed!\n"); 
   return 1; 
  } 
  return 0; 
 } 

 //参数不正确 
 if(argc!=2) 
 { 
  ShowHelp(); 
  return 0; 
 } 
  
 //参数可识别 
  
 //显示帮助 
 if(!strcmp("/?",argv[1]))   
 { 
  ShowHelp();   
  return 0; 
 } 
 //安装服务 
 if(!strcmp("/i",argv[1])) 
 { 
  InsallService(); 
  return 0; 
 } 
 //移除服务 
 if(!strcmp("/r",argv[1])) 
 { 
  RemoveService(); 
  return 0; 
 } 
  
 //参数不可识别 
 ShowHelp(); 
  
 return 0; 
} 

//显示帮助 
void ShowHelp() 
{ 
 //显示参数提示 
 printf("parameters:\n"); 
 printf("/?      show this help\n"); 
 printf("/i      install the service\n"); 
 printf("/r      remove the service\n"); 
} 

//安装服务 
void InsallService() 
{ 
 SC_HANDLE schService,schSCManager; 
 char FileName[256],DisplayName[]="NT Service"; 
 //获取文件名 
 if (GetModuleFileName(0,FileName,256)==0) return; 
 //打开服务管理器 
 schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
 if (schSCManager==0) 
 { 
  printf("Open SCManager failed!\n"); 
  return; 
 } 
 //创建服务 
 schService=CreateService(schSCManager,ServiceName,DisplayName,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, 
 SERVICE_ERROR_NORMAL,FileName,NULL,NULL,NULL,NULL,NULL); 
 if (schService>0) 
 { 
  printf("Service %s installed!\n",ServiceName); 
  //关闭服务 
  CloseServiceHandle(schService); 
 } 
 else 
 { 
  printf("Service %s install failed!\n",ServiceName); 
 } 
 //关闭服务控制器 
 CloseServiceHandle(schSCManager); 
} 

//移除服务 
void RemoveService() 
{ 
 SC_HANDLE schService,schSCManager; 
 //打开服务管理器 
 schSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); 
 if (schSCManager==0) 
 { 
  printf("Open SCManager failed!\n"); 
  return; 
 } 
 //打开服务 
 schService=OpenService(schSCManager,ServiceName, SERVICE_ALL_ACCESS); 
 if (schService==0) 
 { 
  printf("Cann't open service!\n"); 
  //关闭服务 
  CloseServiceHandle(schSCManager); 
  return; 
 } 
 else 
 { 
  //停止服务 
  if(ControlService(schService, SERVICE_CONTROL_STOP, &ssStatus)) 
  { 
   //查询服务状态 
   while(QueryServiceStatus(schService, &ssStatus)) 
   { 
    if(ssStatus.dwCurrentState==SERVICE_STOP_PENDING) printf("%s","."); 
    else break; 
   } 
   if(ssStatus.dwCurrentState==SERVICE_STOPPED) printf("Service Stoped Now!\n"); 
   else 
   { 
    printf("Service stop failed!\n"); 
    return; 
   } 
  } 
  //删除服务 
  if(DeleteService(schService)) 
  { 
   printf("Service removed!\n");    
  } 
  else 
  { 
   printf("Service remove failed!\n"); 
  } 
  //关闭服务 
  CloseServiceHandle(schService); 
 } 
 //关闭控制器 
 CloseServiceHandle(schSCManager); 
} 

//服务程序入口 
void WINAPI ServiceMain(DWORD dwArgc,LPTSTR* lpszArgv) 
{ 
 //设置初始状态 
 ssStatus.dwServiceType=SERVICE_WIN32; 
 ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE; 
 ssStatus.dwCurrentState=SERVICE_START_PENDING; 

 //注册服务 
 ServiceStatusHandle=RegisterServiceCtrlHandler(ServiceName, ControlHandler); 
 if(ServiceStatusHandle==0) return; 
  
 //设置服务状态 
 if(!SetServiceStatus(ServiceStatusHandle,&ssStatus)) 
 { 
  //服务停止 
  ssStatus.dwCurrentState=SERVICE_STOPPED; 
  SetServiceStatus(ServiceStatusHandle,&ssStatus); 
 } 

 //服务运行 
 ssStatus.dwCurrentState=SERVICE_RUNNING; 
 SetServiceStatus(ServiceStatusHandle,&ssStatus); 
} 

//服务控制器 
void WINAPI ControlHandler(DWORD dwCtrlCode) 
{ 
 //识别控制码 
 switch(dwCtrlCode) 
 { 
  //暂停 
  case SERVICE_CONTROL_PAUSE: 
   ssStatus.dwCurrentState=SERVICE_PAUSED; 
   break; 
  //继续 
  case SERVICE_CONTROL_CONTINUE: 
   ssStatus.dwCurrentState=SERVICE_RUNNING; 
   break; 
  //停止 
   case SERVICE_CONTROL_STOP: 
   ssStatus.dwCurrentState=SERVICE_STOPPED; 
   SetServiceStatus(ServiceStatusHandle,&ssStatus); 
   break; 
 } 
  
 //设置服务状态 
 SetServiceStatus(ServiceStatusHandle,&ssStatus); 

 return; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

螃蟹@横着走

感谢您的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值