WinAPI 编写基本服务程序

本文提供了一个Windows服务编程的实例,该服务定期记录系统的可用物理内存,并将这些信息写入到指定的日志文件中。服务还支持接收停止和关闭指令。

 


  1. #include <Windows.h> 
  2. #include <stdio.h> 
  3. #include <WinBase.h> 
  4.  
  5. #define SLEEP_TIME 5000 
  6. #define LOGFILE "D:\\memorylog.txt" 
  7.  
  8. SERVICE_STATUS ServiceStatus; 
  9. SERVICE_STATUS_HANDLE hStatus; 
  10.  
  11. VOID WINAPI Handler(DWORD fdwControl); 
  12. VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv); 
  13. INT InitService(VOID); 
  14. INT WriteToLog(char* str); 
  15.  
  16. VOID main(VOID){ 
  17.     SERVICE_TABLE_ENTRY ServiceTable[]={{"Pnig0srv",(LPSERVICE_MAIN_FUNCTION)ServiceMain},{NULL,NULL}}; 
  18.     if(!StartServiceCtrlDispatcher(ServiceTable)){ 
  19.         printf("Start Service failed.(%d)\n",GetLastError()); 
  20.     } 
  21.  
  22. VOID WINAPI ServiceMain(DWORD dwArgc,LPTSTR lpszArgv){ 
  23.     int error; 
  24.     ServiceStatus.dwServiceType = SERVICE_WIN32; 
  25.     ServiceStatus.dwCurrentState = SERVICE_START_PENDING; 
  26.     ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN; 
  27.     ServiceStatus.dwWin32ExitCode = 0; 
  28.     ServiceStatus.dwServiceSpecificExitCode = 0; 
  29.     ServiceStatus.dwCheckPoint = 0; 
  30.     ServiceStatus.dwWaitHint = 0; 
  31.  
  32.     hStatus = RegisterServiceCtrlHandler("Pnig0srv",(LPHANDLER_FUNCTION)Handler); 
  33.  
  34.     if(hStatus == (SERVICE_STATUS_HANDLE)0){ 
  35.         return
  36.     } 
  37.     error = InitService(); 
  38.     if(error){ 
  39.         ServiceStatus.dwCurrentState = SERVICE_STOP; 
  40.         ServiceStatus.dwWin32ExitCode = -1; 
  41.         SetServiceStatus(hStatus,&ServiceStatus); 
  42.         return
  43.     } 
  44.     ServiceStatus.dwCurrentState = SERVICE_RUNNING; 
  45.     SetServiceStatus(hStatus,&ServiceStatus); 
  46.  
  47.     MEMORYSTATUS memory; 
  48.     while(ServiceStatus.dwCurrentState == SERVICE_RUNNING){ 
  49.         char buffer[16]; 
  50.         GlobalMemoryStatus(&memory); 
  51.         sprintf(buffer, "%d", memory.dwAvailPhys); 
  52.         int result = WriteToLog(buffer); 
  53.         if (result) 
  54.         { 
  55.             ServiceStatus.dwCurrentState =  
  56.                 SERVICE_STOPPED;  
  57.             ServiceStatus.dwWin32ExitCode      = -1;  
  58.             SetServiceStatus(hStatus,  
  59.                 &ServiceStatus); 
  60.             return
  61.         } 
  62.         Sleep(SLEEP_TIME); 
  63.     } 
  64.     return
  65.  
  66. VOID WINAPI Handler(DWORD fdwControl){ 
  67.     switch(fdwControl)  
  68.     {  
  69.     case SERVICE_CONTROL_STOP:  
  70.         WriteToLog("Monitoring stopped."); 
  71.  
  72.         ServiceStatus.dwWin32ExitCode = 0;  
  73.         ServiceStatus.dwCurrentState = SERVICE_STOPPED;  
  74.         SetServiceStatus (hStatus, &ServiceStatus); 
  75.         return;  
  76.  
  77.     case SERVICE_CONTROL_SHUTDOWN:  
  78.         WriteToLog("Monitoring stopped."); 
  79.  
  80.         ServiceStatus.dwWin32ExitCode = 0;  
  81.         ServiceStatus.dwCurrentState = SERVICE_STOPPED;  
  82.         SetServiceStatus (hStatus, &ServiceStatus); 
  83.         return;  
  84.  
  85.     default
  86.         break
  87.     }  
  88.  
  89.     SetServiceStatus (hStatus, &ServiceStatus); 
  90.  
  91.     return;  
  92.  
  93. INT WriteToLog(char* str) 
  94.     FILE* log; 
  95.     log = fopen(LOGFILE, "a+"); 
  96.     if (log == NULL) 
  97.         return -1; 
  98.     fprintf(log, "%s\n", str); 
  99.     fclose(log); 
  100.     return 0; 
  101.  
  102. INT InitService(){ 
  103.     int result; 
  104.     result = WriteToLog("Monitoring started."); 
  105.     return(result);  

 

本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/674402,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值