用 C 语言编写 Windows 服务程序

本文介绍了一个Windows环境下用于监控系统内存状态的服务程序实现。该服务能够周期性地记录可用物理内存,并将数据写入到指定的日志文件中。此外,服务还支持通过控制消息进行停止和关闭操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
// 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值