编写一个简单的服务程序

Windows服务程序编写
本文介绍了一个简单的Windows服务程序框架,包括main()、ServiceMain()和ServiceCtrlHandler()三个关键函数的作用及实现方式,并提供了一个具体的示例代码。

网上已经有很多介绍编写服务程序的文章,而且《Win32系统服务开发与实例》这本书更加系统详细地介绍了。不过我想自己下笔写写,这样更能帮助我消化。

每个服务都是根据一个框架来搭建的,只要掌握了这个框架,就可以编写一个简单的服务程序了。下面首先来介绍这个框架。
这个框架主要包括3个函数:main(),ServiceMain()和ServiceCtrlHandler()。

main()函数,主要向SCM注册ServiceMain函数,它先初始化一个SERVICE_TABLE_ENTRY结构,这个结构主要记载了你将要创建的服务名称和对应服务的ServiceMain函数,这里可以填写多个服务,后面会介绍如何填写这个结构。填写了这个结构之后,就该时候调用StartServiceCtrlDispatcher函数来向SCM注册这个结构了。这里有一点要注意的是,从main开始执行,到调用StartServiceCtrlDispatcher函数之间的时间不能超过30秒,不然的话,SCM就会认为是时间超时,内部出现错误,从而终止服务。

ServiceMain()函数,当SCM启动服务的时候,系统会自动调用相应服务的ServiceMain函数。在这个函数里面可以完成一些初始化工作,主要包括注册请求操作函数,调用RegisterServiceCtrlHandler函数来完成。当SCM发送停止、暂停、重新开始等等请求的时候,该函数会自动被调用,来处理这些请求信息。ServiceMain函数的另外一个重大任务是创建真正的服务线程或者进程,这些线程和进程主要来执行你要做的服务工作。这里要注意的是,如果ServiceMain函数返回了,该服务就会终止,所以在正常的情况下,你要保证你的服务继续运行,你可以通过设置一个事件,然后在ServiceMain函数的后面等待这个事件。

ServiceCtrlHandler()函数,该函数主要处理发送给服务的请求信息,例如停止、暂停、重新开始。它接收一个整数控制代码,然后你需要判断这个控制代码对应的是什么请求,然后再完成相应的处理工作。
主要的控制代码有:
SERVICE_CONTROL_STOP:通知服务停止
SERVICE_CONTROL_PAUSE:通知服务暂停
SERVICE_CONTROL_CONTINUE:通知服务重新开始
SERVICE_CONTROL_INTERROGATE:通知服务立即报告当前状态
SERVICE_CONTROL_SHUTDOWN:通知服务紧急关闭

下面是一个简单服务程序:

编写中断服务程序的过程可以分为以下几个步骤: 1. 确定中断向量号:中断向量号是一个唯一的编号,用于标识不同的中断类型。您需要确定您的中断类型所对应的中断向量号。 2. 建立中断服务程序:中断服务程序是处理中断的程序段,它会在中断发生时被调用。您需要编写一个中断服务程序来处理您的中断类型。 3. 设置中断向量表:中断向量表是一个包含所有中断向量号和对应中断服务程序地址的表格。您需要将您的中断服务程序地址写入中断向量表中的相应位置。 4. 启用中断:在启用中断之前,您的中断服务程序将不会被调用。您需要在代码中启用中断以确保您的中断服务程序能够被正确调用。 下面是一个简单的例子,演示如何编写一个中断服务程序: ```c #include <stdio.h> #include <dos.h> void interrupt my_isr(void) { printf("Interrupt occurred!\n"); // 处理中断事件的代码 // ... // 中断结束 outportb(0x20, 0x20); // 告诉 PIC 可以接收下一个中断 } int main() { // 设置中断向量表 setvect(0x08, my_isr); // 设置中断向量号为 0x08 的中断服务程序为 my_isr // 启用中断 _enable(); // 启用中断 // 等待中断事件 while(1) { // 等待中断事件的代码 // ... } // 禁用中断 _disable(); // 禁用中断 return 0; } ``` 这个例子演示了如何编写一个简单的中断服务程序,并将其设置为处理中断向量号为 0x08 的中断事件。在 main 函数中,我们使用 setvect 函数将 my_isr 函数设置为中断向量号为 0x08 的中断服务程序,并使用 _enable 函数启用中断。在中断服务程序中,我们打印一条消息并使用 outportb 函数告诉 PIC 可以接收下一个中断。在 main 函数中,我们使用一个无限循环等待中断事件的发生,直到程序退出。最后,我们使用 _disable 函数禁用中断,以确保程序退出后不再处理中断。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值