博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WinAPI 编写基本服务程序
阅读量:7046 次
发布时间:2019-06-28

本文共 2551 字,大约阅读时间需要 8 分钟。

 

 
  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,如需转载请自行联系原作者

你可能感兴趣的文章
Java设计模式之代理模式
查看>>
rsync+inotify实时同步备份服务
查看>>
思科·远程连接、密码破解
查看>>
iptables防火墙(一)
查看>>
c++学习笔记---虚函数与纯虚函数
查看>>
Android 音视频深入 三 MP4解码播放视频 (附源码下载)
查看>>
Linux学习- 1 初始Linux 20180407
查看>>
故障盘查
查看>>
微服务分布式企业框架 Springmvc+mybatis+shiro+Dubbo+ZooKeeper
查看>>
在RHEL搭建ftp服务
查看>>
Docker常用命令总结(附例子)
查看>>
大数据如何解决大问题
查看>>
PTGUI全景合成软件使用教程之HDR合成
查看>>
简单谈谈如何利用h5实现音频的播放
查看>>
shell编程 ---test
查看>>
Andriod 对话框 .
查看>>
程序员:面试挂了,面试官说我没有互联网气质,网友:那是啥气质
查看>>
有史以来,程序员被黑的最最最惨的一次!
查看>>
微信第三方平台全网发布检测
查看>>
企业WiFi解决方案 安全上网很重要
查看>>