用 C 语言编写 Windows 服务程序

2023-05-16

 
//  NTService.cpp : Defines the entry point for the console application.
//

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

#define  SLEEP_TIME 5000
#define  LOGFILE "C:/MyServices/memstatus.txt"


SERVICE_STATUS ServiceStatus; 
SERVICE_STATUS_HANDLE hStatus; 

void  ServiceMain( int  argc,  char **  argv); 
void  ControlHandler(DWORD request); 
int  InitService();
int  WriteToLog( char *  str);


int  main( int  argc,  char *  argv[])
{
    SERVICE_TABLE_ENTRY ServiceTable[
2 ];
    ServiceTable[
0 ].lpServiceName  =   " MemoryStatus " ;
    ServiceTable[
0 ].lpServiceProc  =  (LPSERVICE_MAIN_FUNCTION)ServiceMain;
    
    ServiceTable[
1 ].lpServiceName  =  NULL;
    ServiceTable[
1 ].lpServiceProc  =  NULL;

    
//  启动服务的控制分派机线程
    StartServiceCtrlDispatcher(ServiceTable); 
}




void  ServiceMain( int  argc,  char **  argv) 

   
int  error; 
 
   ServiceStatus.dwServiceType 
=  
      SERVICE_WIN32; 
   ServiceStatus.dwCurrentState 
=  
      SERVICE_START_PENDING; 
   ServiceStatus.dwControlsAccepted   
=   
      SERVICE_ACCEPT_STOP 
|  
      SERVICE_ACCEPT_SHUTDOWN;
   ServiceStatus.dwWin32ExitCode 
=   0
   ServiceStatus.dwServiceSpecificExitCode 
=   0
   ServiceStatus.dwCheckPoint 
=   0
   ServiceStatus.dwWaitHint 
=   0
 
   hStatus 
=  RegisterServiceCtrlHandler(
      
" MemoryStatus "
      (LPHANDLER_FUNCTION)ControlHandler); 
   
if  (hStatus  ==  (SERVICE_STATUS_HANDLE) 0
   { 
      
//  Registering Control Handler failed
       return
   }  
   
//  Initialize Service 
   error  =  InitService(); 
   
if  ( ! error) 
   {
      
//  Initialization failed
      ServiceStatus.dwCurrentState  =  
         SERVICE_STOPPED; 
      ServiceStatus.dwWin32ExitCode 
=   - 1
      SetServiceStatus(hStatus, 
& ServiceStatus); 
      
return
   } 
   
//  We report the running status to SCM. 
   ServiceStatus.dwCurrentState  =  
      SERVICE_RUNNING; 
   SetServiceStatus (hStatus, 
& ServiceStatus);
 
   MEMORYSTATUS memory;
   
//  The worker loop of a service
    while  (ServiceStatus.dwCurrentState  ==  
          SERVICE_RUNNING)
   {
      
char  buffer[ 16 ];
      GlobalMemoryStatus(
& memory);
      sprintf(buffer, 
" %d " , memory.dwAvailPhys);
      
int  result  =  WriteToLog(buffer);
      
if  (result)
      {
         ServiceStatus.dwCurrentState 
=  
            SERVICE_STOPPED; 
         ServiceStatus.dwWin32ExitCode      
=   - 1
         SetServiceStatus(hStatus, 
                          
& ServiceStatus);
         
return ;
      }
      Sleep(SLEEP_TIME);
   }
   
return
}



void  ControlHandler(DWORD request) 

   
switch (request) 
   { 
      
case  SERVICE_CONTROL_STOP: 
         WriteToLog(
" Monitoring stopped. " );

         ServiceStatus.dwWin32ExitCode 
=   0
         ServiceStatus.dwCurrentState 
=  SERVICE_STOPPED; 
         SetServiceStatus (hStatus, 
& ServiceStatus);
         
return
 
      
case  SERVICE_CONTROL_SHUTDOWN: 
         WriteToLog(
" Monitoring stopped. " );

         ServiceStatus.dwWin32ExitCode 
=   0
         ServiceStatus.dwCurrentState 
=  SERVICE_STOPPED; 
         SetServiceStatus (hStatus, 
& ServiceStatus);
         
return
        
      
default :
         
break ;
    } 
 
    
//  Report current status
    SetServiceStatus (hStatus,  & ServiceStatus);
 
    
return
}


int  WriteToLog( char *  str)
{
    FILE
*  log;
    log 
=  fopen(LOGFILE,  " a+ " );
    
if  (log  ==  NULL)
    
return   - 1 ;
    fprintf(log, 
" %s " , str);
    fclose(log);
    
return   0 ;
}

int  InitService(){
    WriteToLog(
" Monitoring started. " );
    
return   true ;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用 C 语言编写 Windows 服务程序 的相关文章

随机推荐

  • 51单片机连接ESP8266串口WiFi模块

    烧录固件 引脚连接 WiFi51单片机VCC3 3V xff08 5V连接时间过长可能会烧坏WiFi模块 xff09 GNDGNDCH PD3 3VGPIO0GNDUTXDTXDURXDRXD 烧录固件 打开烧录软件 xff0c 选择配置选
  • linux 远程可视化

    实验linux是vmware上的rhel6 0 xff0c 安装的是centos社区桌面 xff0c ip 192 168 31 223 xff0c win设置的固定ip 192 168 31 166 xff0c 且远程ssh软件用的是Se
  • 【七夕节】浪漫七夕,代码传情。将爱意变成绚烂的立体场景,给她(他)一个惊喜!(送代码)

    浪漫七夕 xff0c 代码传情 将爱意变成绚烂的立体场景 xff0c 给她 xff08 他 xff09 一个惊喜 xff01 一 python代码 xff08 情话转二进制编码 xff09 二 js代码部分 xff08 二进制编码生成立体场
  • 【可信执行环境】Keystone 简介

    当下 xff0c 安全挑战是一个非常突出的问题 可行执行环境TEE Trusted Execution Environment 成为必须满足的特性 1 安全挑战与TEE 1 1 安全挑战的来源 xff1a 1 1 1 被抄板 导致研发投入的
  • 超长docker笔记

    docker ce 和docker ee docker操作容器只需要id前4位就可以 docker编译安装 https blog csdn net lwyeluo article details 51765309 删除命令 docker r
  • 第1课【寄存器开发到库开发】寄存器 库 位操作 封装 分层 GPIO

    目录 基本知识框架课堂笔记什么是寄存器开发什么是库开发寄存器开发和库开发的关联寄存器开发的基本流程寄存器开发的优缺点 库开发的基本流程库开发的优缺点 结论 如何从寄存器开发实现库开发 xff08 GPIO口为例 xff0c 通过操作其寄存器
  • python str基本用法

    目录 1 没什么用的 1 1 调用实例属性后自动执行 getattribute 1 2 实例化后自动调用 new 1 3 将其他变量转变为字符串 repr 1 4 反向替代占位符 格式化 rmod 1 5 字符串反向做乘法 rmul 1 6
  • 32.QButtonGroup

    目录 1 创建和添加按钮 1 1 创建按钮组 1 2 添加按钮 addButton 2 查看按钮 2 3 获取当前选中的按钮 CheckedButton 3 从按钮组中移除按钮 removeButton 4 ID操作 4 1 设置 setI
  • Windows下的Win32串口编程

    在工业控制中 xff0c 工控机 xff08 一般都基于Windows平台 xff09 经常需要与智能仪表通过串口进行通信 串口通信方便易行 xff0c 应用广泛 一般情况下 xff0c 工控机和各智能仪表通过RS485总线进行通信 RS4
  • Ubuntu内网穿透

    本文借鉴 使用frp进行内网穿透 少数派 目录 1 准备材料 2 服务端部署 3 服务端后台运行 4 客户端部署 1 准备材料 1 一台具有公网IP的实体机 xff08 服务端 xff0c 也可以是vps 2 一台网页部署内网的实体机 客户
  • Ubuntu系统基本操作

    文章中所需要的文件可以在这里下载 链接 xff1a https pan baidu com s 1NYXxHD0jebngmCTEwgjGbQ 提取码 xff1a 2jyo 目录 1 安装谷歌浏览器 2 修改开机启动项 3 快捷键查找与设置
  • Ubuntu向日葵锁定之后忘记密码后解除锁定状态

    此操作会重置本机识别码与本机验证码 我们在使用向日葵的时候会使用锁定按钮 设置完密码之后 xff0c 我们忘了 xff0c 就会导致无法使用向日葵 重新安装也不能解决问题 xff0c 这个时候我们找到etc orayconfig conf
  • 26.疲劳检测

    目录 1 项目介绍 2 代码实现 2 1 导入库 2 2 定义68个关键点 2 3 定义eye aspect ratio 2 4 定义参数 2 5 定义阈值 2 6 定义次数 2 7 创建检测器 2 8 获取左眼与右眼的起始点与终止点 2
  • NX点亮oled

    效果是这样的 目录 1 接线 2 配置环境 3 运行代码 4 显示开发板信息 1 接线 小屏幕的名称叫oled xff0c 使用芯片SSD1306驱动 上面有四个引脚 xff0c 与NX接线如下 VCC 5V GND GND SDA 3 S
  • 43.一维卷积-航空公司评论情感预测

    之前我们使用的都是二维卷积 xff0c 二维卷积处理图像问题 xff0c 这次我们使用一维卷积 xff0c 一维卷积处理序列问题 一维卷积就是在一个序列上进行滑动 xff0c 从而得出一维卷积的结果 xff0c 详细一维卷积的介绍可以看一下
  • serial库常见用法

    安装的时候要输入 pip install pyserial 进行安装 serial是python做串口通讯的库 xff0c 在这里介绍了NX与Windows串口通讯 NX串口通讯windows Suyuoa的博客 CSDN博客 目录 1 使
  • Ubuntu开机自启动一些东西

    有三种方式做开机自启动 目录 1 免除sudo密码 2 Startup 2 desktop 3 service 1 免除sudo密码 做完这一步你的所有sudo命令都不会再让你输密码了 如果你的开机自启动的东西需要sudo xff0c 那么
  • 附录3-动态组件 component与keep-alive setup()写法

    目录 1 基本使用 2 按钮切换组件 3 keep alive 3 1 在切换组件的时候 xff0c 默认情况下被切换的组件就会被销毁 3 1 1 数据情况 3 1 2 生命周期函数情况 3 2 使用 keep alive 3 3 keep
  • 附录11-插件ESLint与prettier

    ESLint是提示错误的 xff0c prettier是帮你解决错误的 目录 1 ESLint 1 1 安装 1 2 配置 1 3 效果 2 prettier 1 ESLint 1 1 安装 1 2 配置 在插件介绍中 xff0c 搜索 e
  • 用 C 语言编写 Windows 服务程序

    NTService cpp Defines the entry point for the console application include lt windows h gt include lt stdio h gt define S