使用windowsAPI编写一个系统服务程序 完整的编写逻辑

[复制链接]
查看: 3452|回复: 31
发表于 2023-2-17 19:03:50 | 显示全部楼层 | 阅读模式
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define SLEEP_TIME 5000
#define FILE_PATH "c:\\log.txt"
BOOL bRunning;
void WINAPI ServiceMain(int argc,char** argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
int WriteToLog(char* str);

void main(void){
        SERVICE_TABLE_ENTRY DispatchTable[2];
        DispatchTable[0].lpServiceName="demo";
        DispatchTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain;
        DispatchTable[1].lpServiceName=NULL;
        DispatchTable[1].lpServiceProc=NULL;

        StartServiceCtrlDispatcher(DispatchTable);//注册服务主函数

}

int WriteToLog(char* str){
        FILE* pfile;
        fopen_s(&pfile,FILE_PATH,"a+");
        if(pfile==NULL){
                return -1;
        }
        fprintf_s(pfile,"%s\n",str);
        fclose(pfile);
        return 0;
}


void WINAPI ServiceMain(int argc,char** argv){
        MEMORYSTATUS memstatus;
        char str[100];
        int availmb;
        m_ServiceStatus.dwServiceType=SERVICE_WIN32;
        m_ServiceStatus.dwCurrentState=SERVICE_START_PENDING;
        m_ServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_SHUTDOWN|SERVICE_ACCEPT_STOP;
        m_ServiceStatus.dwWin32ExitCode=0;
        m_ServiceStatus.dwServiceSpecificExitCode=0;
        m_ServiceStatus.dwCheckPoint=0;
        m_ServiceStatus.dwWaitHint=0;


        //注册服务控制函数
        m_ServiceStatusHandle = RegisterServiceCtrlHandler("demo",ServiceCtrlHandler);
        if(m_ServiceStatusHandle==0){
                WriteToLog("写出失败日志");
                return;
        }
        WriteToLog("写出成功日志");
        m_ServiceStatus.dwCurrentState=SERVICE_RUNNING;
        SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
        bRunning=TRUE;
        memset(str,'\0',100);
        while(bRunning){
                GlobalMemoryStatus(&memstatus);
                availmb=memstatus.dwAvailPhys/1024/1024;
                sprintf_s(str,100,"可用内存的大小是%dMB",availmb);
                WriteToLog(str);//每隔5秒写出执行日志
                Sleep(SLEEP_TIME);
        }
        WriteToLog("服务停止写出日志");
}

void WINAPI ServiceCtrlHandler(DWORD Opcode){
        switch(Opcode){
        case SERVICE_CONTROL_STOP:
                bRunning=FALSE;
                m_ServiceStatus.dwCurrentState=SERVICE_STOPPED;
                break;
        case SERVICE_CONTROL_SHUTDOWN:
                bRunning=FALSE;
                m_ServiceStatus.dwCurrentState=SERVICE_STOPPED;
                break;
        default:
                break;
        }
        SetServiceStatus(m_ServiceStatusHandle,&m_ServiceStatus);
}



生成后cmd执行sc命令安装服务
sc create demo3 binpath= c:\demo3.exe


使用windowsAPI编写一个系统服务程序 完整的编写逻辑

使用windowsAPI编写一个系统服务程序 完整的编写逻辑

启动服务后完美运行并写出日志

使用windowsAPI编写一个系统服务程序 完整的编写逻辑


以上代码生成的可执行服务程序
使用windowsAPI编写一个系统服务程序 完整的编写逻辑 点击此处下载

demo3.zip

8.66 KB

[ 8.66 KB, ,2023-2-17 19:08 上传 ]
[充值金币]
易博软件介绍

0

主题

14

帖子

8

积分

营销入门

Rank: 2

积分
8
发表于 2023-2-18 20:27:16 | 显示全部楼层
中国太需要有志之士了,愿大家都共同努力吧!  

0

主题

8

帖子

5

积分

营销入门

Rank: 2

积分
5
发表于 2023-2-19 17:34:48 | 显示全部楼层
很受看!

0

主题

12

帖子

7

积分

营销入门

Rank: 2

积分
7
发表于 2023-2-20 08:39:48 | 显示全部楼层
我不是计算机系的,但是也想从事程序员之类的工作,今年找工作,遇到种种挫折,今天读到这篇文章,受益匪浅啊!非常感谢,值得深思!

0

主题

10

帖子

6

积分

营销入门

Rank: 2

积分
6
发表于 2023-2-21 02:50:03 | 显示全部楼层
是呀也许这就是中国教育饿偏差吧?  非常感谢上文的作者的经验之谈,对于我们这些还没有出炉的是一笔宝贵的财富!!!!

1

主题

192

帖子

98

积分

营销菜鸟

Rank: 3Rank: 3

积分
98
发表于 2023-2-21 19:57:19 | 显示全部楼层
这的确是很多编程者的误区,谢谢,让我们少走弯路了!!
发表于 2023-2-26 19:45:10 | 显示全部楼层
^其实不光是计算机编程,其他学术方面也有同样问题,大学,中学,甚至小学教学都只是完成任务式的教育从不理会学生该怎么样,这是中国教育体制问题

0

主题

12

帖子

7

积分

营销入门

Rank: 2

积分
7
发表于 2023-2-28 19:54:18 | 显示全部楼层
受益匪浅。。。。。

0

主题

10

帖子

6

积分

营销入门

Rank: 2

积分
6
发表于 2023-3-1 13:58:25 | 显示全部楼层
我非常同意10楼的意见,真的是写出了我们的心声,真是谢谢了

0

主题

12

帖子

7

积分

营销入门

Rank: 2

积分
7
发表于 2023-3-3 15:08:22 | 显示全部楼层
说了确实是有点热血沸腾...  有些时候一个问题并不是一会儿就能找到最好方法的  所以每当写一行程序时就应想想当运行到这时会怎么样  想的多了大脑也就精了  最顶楼那个面试官难道是一开始就想到了用那种方法  有规律的才能有最简的方法-----只是一时没想到而已  另外我就不懂离散数学是什么样的(是估计值吗)  
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1、请认真发帖,禁止回复纯表情,纯数字等无意义的内容!帖子内容不要太简单!
2、提倡文明上网,净化网络环境!抵制低俗不良违法有害信息。
3、如果你对主帖作者的帖子不屑一顾的话,请勿回帖。谢谢合作!
3、问答求助区发帖求助后,如有其他用户热心帮您解决问题后,请自觉点击设为最佳答案按钮。

 
 
QQ在线客服
QQ技术支持
工作时间:
8:00-18:00
软著登字:
1361266号
官方微信扫一扫
weixin

QQ|小黑屋|Archiver|慈众营销 ( 粤ICP备15049986号 )|网站地图

自动发帖软件 | 自动发帖器 | 营销推广软件 | 网络营销工具 | 网络营销软件 | 网站推广工具 | 网络推广软件 | 网络推广工具 | 网页推广软件 | 信息发布软件 | 网站推广工具 | 网页推广软件

Powered by Discuz! X3.4   © 2012-2020 Comsenz Inc.  慈众科技 - Collect from 深圳吉宝泰佛文化有限公司 公司地址:罗湖区黄贝街道深南东路集浩大厦A1403

返回顶部 返回列表