Win32服务介绍
来源:互联网 发布:潼关县四知学校 电话 编辑:程序博客网 时间:2024/05/22 03:01
Windows NT 中的服务实际上是一个程序,只要计算机操作系统一启动,服务就可以运行其中。它不需要用户登陆。服务程序是一种与用户无关的任务,比如目录复制,进程监控或网络上供其它机器使用的服务,比如 HTTP 协议支持。
A.服务的三个组成部分
一个服务由三部分组成,第一部分是Service Control Manager(SCM)。每个Windows NT/2000系统都有一个SCM,SCM存在于Service.exe中,在Windows启动的时候会自动运行,伴随着操作系统的启动和关闭而产生和终止。这个进程以系统特权运行,并且提供一个统一的、安全的手段去控制服务。它其实是一个RPC Server,因此我们可以远程安装和管理服务。SCM包含一个储存着已安装的服务和驱动程序的信息的数据库,通过SCM可以统一的、安全的管理这些信息,因此一个服务程序的安装过程就是将自身的信息写入这个数据库。
第二部分就是服务本身。一个服务拥有能从SCM收到信号和命令所必需的的特殊代码,并且能够在处理后将它的状态回传给SCM。
第三部分也就是最后一部分,是一个Service Control Dispatcher(SCP)。它是一个拥有用户界面,允许用户开始、停止、暂停、继续,并且控制一个或多个安装在计算机上服务的Win32应用程序。SCP的作用是与SCM通讯,Windows 2000管理工具中的“服务”就是一个典型的SCP。
B.编写 Windows 服务程序的五个步骤
1)主函数和全局定义
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
int InitService();
void main()
{
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);
}
2)ServiceMain 函数
该函数是服务的入口点。它运行在一个单独的线程当中,这个线程是由控制分派器创建的。ServiceMain 应该尽可能早早为服务注册控制处理器。这要通过调RegisterServiceCtrlHadler 函数来实现。你要将两个参数传递给此函数:服务名和指向 ControlHandlerfunction 的指针。它指示控制分派器调用 ControlHandler 函数处理 SCM 控制请求。注册完控制处理器之后,获得状态句柄(hStatus)。通过调用 SetServiceStatus 函数,用 hStatus 向 SCM 报告服务的状态。
3)处理控制请求
在第二步中,用 ServiceMain 函数注册了控制处理器函数。控制处理器与处理各种 Windows 消息的窗口回调函数非常类似。它检查 SCM 发送了什么请求并采取相应行动。
每次调用 SetServiceStatus 函数的时候,必须指定服务接收 STOP 和 SHUTDOWN 请
求。STOP 请求是 SCM 终止服务的时候发送的。例如,如果用户在“服务”控制面板中手动
终止服务。SHUTDOWN 请求是关闭机器时,由 SCM 发送给所有运行中服务的请求,控制处理器函数必须报告服务状态,即便 SCM 每次发送控制请求的时候状态保持相同。因此,不管响应什么请求,都要调用 SetServiceStatus()。
4)安装和配置服务
程序编好了,将之编译成 exe 文件。本文例子创建的文件叫 MemoryStatus.exe,将它拷贝到 C:/MyServices 文件夹。为了在机器上安装这个服务,需要用 SC.EXE 可执行文件,它是 Win32 Platform SDK 中附带的一个工具。(译者注:Visaul Studio .NET 2003 IDE 环境中也有这个工具,具体存放位置在:C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/Tools/Bin/winnt)。使用这个实用工具可以安装和移除服务。其它控制操作将通过服务控制面板来完成。以下是用命令行安装 MemoryStatus 服务的方法:
sc create MemoryStatus binpath= c:/MyServices/MemoryStatus.exe
发出此创建命令。指定服务名和二进制文件的路径(注意 binpath= 和路径之间的那个空格)。安装成功后,便可以用服务控制面板来控制这个服务(参见图4-15)。用控制面板的工具栏启动和终止这个服务。
服务控制面板
以下是从系统中移除服务的方法:
sc delete MemoryStatus
指定 “delete” 选项和服务名。此服务将被标记为删除,下次西通重启后,该服务将被完全移除。
5)测试服务
Win32 服务不好调试,可以在一个日至文件里输出程序运行的信息,这样可以方便调试和测试。
- Win32服务介绍
- Win32系统服务说明
- Win32程序设计之服务
- Win32程序设计之服务
- Win32服务Demo 【C】
- Win32 服务类
- Win32 API 系统服务
- Win32 服务控制
- libusb-win32介绍
- libusb-win32介绍
- libusb-win32介绍
- LibUSB-Win32程序介绍
- libusb-win32介绍
- LibUSB-Win32程序介绍
- 【转帖】Win32程序设计之服务
- Win32服务程序常见问题集锦
- 关于编写win32服务程序,
- WIN32服务----SC命令使用
- 200908 每日一句(By 宇宙老人)
- 8个实用而有趣Bash命令提示行
- 方便查阅 UML 中的图、关系等
- AVLTree - 二叉平衡树的实现之二(C++)
- 虚拟机软件VMware 6.5.1正式版下载
- Win32服务介绍
- 200909 每日一句(By 宇宙老人)
- 关于编译原理。
- xslt
- URLDownloadToFile
- 读 《小言 皇帝内经 与生命科学》
- 在学习中成长自己
- JSP中两种包含指令标签区别
- char[] char数组 char*返回值的问题